@mmerterden/multi-agent-pipeline 20.7.0 → 20.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (264) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/LICENSE +0 -10
  3. package/docs/facts.json +1 -1
  4. package/manifest.json +266 -267
  5. package/package.json +2 -2
  6. package/pipeline/scripts/_notices.mjs +1 -1
  7. package/pipeline/skills/.skill-manifest.json +68 -68
  8. package/pipeline/skills/shared/README.md +70 -70
  9. package/pipeline/skills/shared/external/alarmkit/SKILL.md +373 -381
  10. package/pipeline/skills/shared/external/alarmkit/evals/evals.json +23 -18
  11. package/pipeline/skills/shared/external/alarmkit/references/alarmkit-patterns.md +328 -378
  12. package/pipeline/skills/shared/external/app-clips/SKILL.md +260 -160
  13. package/pipeline/skills/shared/external/app-clips/evals/evals.json +27 -27
  14. package/pipeline/skills/shared/external/app-clips/references/data-handoff-notifications-location.md +150 -83
  15. package/pipeline/skills/shared/external/app-clips/references/routing-and-experiences.md +135 -83
  16. package/pipeline/skills/shared/external/app-clips/references/size-capabilities-and-promotion.md +143 -85
  17. package/pipeline/skills/shared/external/app-intents/SKILL.md +302 -304
  18. package/pipeline/skills/shared/external/app-intents/evals/evals.json +21 -21
  19. package/pipeline/skills/shared/external/app-intents/references/appintents-advanced.md +594 -894
  20. package/pipeline/skills/shared/external/app-store-optimization/SKILL.md +339 -277
  21. package/pipeline/skills/shared/external/app-store-optimization/evals/evals.json +27 -23
  22. package/pipeline/skills/shared/external/app-store-optimization/references/keyword-research-methodology.md +105 -122
  23. package/pipeline/skills/shared/external/app-store-optimization/references/product-page-variants.md +143 -166
  24. package/pipeline/skills/shared/external/app-store-review/SKILL.md +307 -326
  25. package/pipeline/skills/shared/external/app-store-review/evals/evals.json +21 -21
  26. package/pipeline/skills/shared/external/app-store-review/references/privacy-manifest.md +105 -67
  27. package/pipeline/skills/shared/external/app-store-review/references/review-checklists.md +114 -101
  28. package/pipeline/skills/shared/external/apple-on-device-ai/SKILL.md +333 -360
  29. package/pipeline/skills/shared/external/apple-on-device-ai/evals/evals.json +24 -27
  30. package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-conversion.md +215 -322
  31. package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-optimization.md +161 -256
  32. package/pipeline/skills/shared/external/apple-on-device-ai/references/foundation-models.md +277 -387
  33. package/pipeline/skills/shared/external/apple-on-device-ai/references/mlx-swift.md +196 -210
  34. package/pipeline/skills/shared/external/authentication/SKILL.md +265 -381
  35. package/pipeline/skills/shared/external/authentication/evals/evals.json +25 -25
  36. package/pipeline/skills/shared/external/authentication/references/keychain-biometric.md +133 -178
  37. package/pipeline/skills/shared/external/authentication/references/passkeys.md +111 -147
  38. package/pipeline/skills/shared/external/avkit/SKILL.md +267 -364
  39. package/pipeline/skills/shared/external/avkit/evals/evals.json +26 -26
  40. package/pipeline/skills/shared/external/avkit/references/avkit-patterns.md +375 -493
  41. package/pipeline/skills/shared/external/background-processing/SKILL.md +270 -382
  42. package/pipeline/skills/shared/external/background-processing/evals/evals.json +22 -22
  43. package/pipeline/skills/shared/external/background-processing/references/background-task-patterns.md +169 -317
  44. package/pipeline/skills/shared/external/callkit-voip/SKILL.md +290 -371
  45. package/pipeline/skills/shared/external/callkit-voip/evals/evals.json +24 -24
  46. package/pipeline/skills/shared/external/callkit-voip/references/callkit-patterns.md +175 -343
  47. package/pipeline/skills/shared/external/cloudkit-sync/SKILL.md +292 -381
  48. package/pipeline/skills/shared/external/cloudkit-sync/evals/evals.json +33 -30
  49. package/pipeline/skills/shared/external/cloudkit-sync/references/cloudkit-patterns.md +227 -355
  50. package/pipeline/skills/shared/external/contacts-framework/SKILL.md +197 -346
  51. package/pipeline/skills/shared/external/contacts-framework/evals/evals.json +19 -21
  52. package/pipeline/skills/shared/external/contacts-framework/references/contacts-patterns.md +169 -308
  53. package/pipeline/skills/shared/external/core-bluetooth/SKILL.md +226 -376
  54. package/pipeline/skills/shared/external/core-bluetooth/evals/evals.json +25 -22
  55. package/pipeline/skills/shared/external/core-bluetooth/references/ble-patterns.md +257 -337
  56. package/pipeline/skills/shared/external/core-data/SKILL.md +292 -368
  57. package/pipeline/skills/shared/external/core-data/evals/evals.json +30 -27
  58. package/pipeline/skills/shared/external/core-motion/SKILL.md +235 -324
  59. package/pipeline/skills/shared/external/core-motion/evals/evals.json +31 -27
  60. package/pipeline/skills/shared/external/core-motion/references/motion-patterns.md +210 -310
  61. package/pipeline/skills/shared/external/core-nfc/SKILL.md +292 -366
  62. package/pipeline/skills/shared/external/core-nfc/evals/evals.json +22 -24
  63. package/pipeline/skills/shared/external/core-nfc/references/nfc-patterns.md +233 -329
  64. package/pipeline/skills/shared/external/coreml/SKILL.md +323 -367
  65. package/pipeline/skills/shared/external/coreml/evals/evals.json +24 -21
  66. package/pipeline/skills/shared/external/coreml/references/coreml-swift-integration.md +562 -565
  67. package/pipeline/skills/shared/external/cryptokit/SKILL.md +253 -394
  68. package/pipeline/skills/shared/external/cryptokit/evals/evals.json +20 -18
  69. package/pipeline/skills/shared/external/cryptokit/references/cryptokit-patterns.md +299 -488
  70. package/pipeline/skills/shared/external/debugging-instruments/SKILL.md +270 -323
  71. package/pipeline/skills/shared/external/debugging-instruments/evals/evals.json +27 -30
  72. package/pipeline/skills/shared/external/debugging-instruments/references/instruments-guide.md +167 -315
  73. package/pipeline/skills/shared/external/debugging-instruments/references/lldb-patterns.md +140 -193
  74. package/pipeline/skills/shared/external/device-integrity/SKILL.md +230 -353
  75. package/pipeline/skills/shared/external/device-integrity/evals/evals.json +25 -21
  76. package/pipeline/skills/shared/external/device-integrity/references/device-integrity-patterns.md +159 -197
  77. package/pipeline/skills/shared/external/energykit/SKILL.md +225 -392
  78. package/pipeline/skills/shared/external/energykit/evals/evals.json +29 -28
  79. package/pipeline/skills/shared/external/energykit/references/energykit-patterns.md +174 -470
  80. package/pipeline/skills/shared/external/eventkit-calendar/SKILL.md +261 -383
  81. package/pipeline/skills/shared/external/eventkit-calendar/evals/evals.json +25 -22
  82. package/pipeline/skills/shared/external/eventkit-calendar/references/eventkit-patterns.md +165 -268
  83. package/pipeline/skills/shared/external/healthkit/SKILL.md +252 -303
  84. package/pipeline/skills/shared/external/healthkit/evals/evals.json +24 -23
  85. package/pipeline/skills/shared/external/healthkit/references/healthkit-patterns.md +369 -523
  86. package/pipeline/skills/shared/external/homekit-matter/SKILL.md +233 -348
  87. package/pipeline/skills/shared/external/homekit-matter/evals/evals.json +27 -22
  88. package/pipeline/skills/shared/external/homekit-matter/references/matter-commissioning.md +199 -305
  89. package/pipeline/skills/shared/external/ios-accessibility/SKILL.md +368 -340
  90. package/pipeline/skills/shared/external/ios-accessibility/evals/evals.json +28 -27
  91. package/pipeline/skills/shared/external/ios-accessibility/references/a11y-patterns.md +314 -260
  92. package/pipeline/skills/shared/external/ios-accessibility/references/media-accessibility.md +97 -67
  93. package/pipeline/skills/shared/external/ios-accessibility/references/nutrition-labels.md +165 -101
  94. package/pipeline/skills/shared/external/ios-localization/SKILL.md +258 -371
  95. package/pipeline/skills/shared/external/ios-localization/evals/evals.json +23 -23
  96. package/pipeline/skills/shared/external/ios-localization/references/formatstyle-locale.md +283 -491
  97. package/pipeline/skills/shared/external/ios-localization/references/string-catalogs.md +313 -440
  98. package/pipeline/skills/shared/external/ios-networking/SKILL.md +265 -341
  99. package/pipeline/skills/shared/external/ios-networking/evals/evals.json +24 -24
  100. package/pipeline/skills/shared/external/ios-networking/references/background-websocket.md +425 -652
  101. package/pipeline/skills/shared/external/ios-networking/references/file-storage-patterns.md +143 -285
  102. package/pipeline/skills/shared/external/ios-networking/references/lightweight-clients.md +93 -53
  103. package/pipeline/skills/shared/external/ios-networking/references/network-framework.md +231 -456
  104. package/pipeline/skills/shared/external/ios-networking/references/urlsession-patterns.md +517 -784
  105. package/pipeline/skills/shared/external/ios-simulator/SKILL.md +265 -393
  106. package/pipeline/skills/shared/external/ios-simulator/evals/evals.json +21 -21
  107. package/pipeline/skills/shared/external/ios-simulator/references/simctl-commands.md +177 -270
  108. package/pipeline/skills/shared/external/live-activities/SKILL.md +318 -360
  109. package/pipeline/skills/shared/external/live-activities/evals/evals.json +21 -21
  110. package/pipeline/skills/shared/external/live-activities/references/activitykit-patterns.md +478 -710
  111. package/pipeline/skills/shared/external/mapkit-location/SKILL.md +295 -267
  112. package/pipeline/skills/shared/external/mapkit-location/evals/evals.json +28 -24
  113. package/pipeline/skills/shared/external/mapkit-location/references/mapkit-corelocation-patterns.md +378 -532
  114. package/pipeline/skills/shared/external/mapkit-location/references/mapkit-patterns.md +397 -499
  115. package/pipeline/skills/shared/external/metrickit-diagnostics/SKILL.md +165 -348
  116. package/pipeline/skills/shared/external/metrickit-diagnostics/evals/evals.json +26 -23
  117. package/pipeline/skills/shared/external/metrickit-diagnostics/references/metrickit-patterns.md +123 -130
  118. package/pipeline/skills/shared/external/musickit-audio/SKILL.md +189 -315
  119. package/pipeline/skills/shared/external/musickit-audio/evals/evals.json +22 -21
  120. package/pipeline/skills/shared/external/musickit-audio/references/musickit-patterns.md +181 -270
  121. package/pipeline/skills/shared/external/natural-language/SKILL.md +188 -340
  122. package/pipeline/skills/shared/external/natural-language/evals/evals.json +21 -21
  123. package/pipeline/skills/shared/external/natural-language/references/translation-patterns.md +171 -225
  124. package/pipeline/skills/shared/external/passkit-wallet/SKILL.md +258 -392
  125. package/pipeline/skills/shared/external/passkit-wallet/evals/evals.json +30 -29
  126. package/pipeline/skills/shared/external/passkit-wallet/references/wallet-passes.md +164 -231
  127. package/pipeline/skills/shared/external/pdfkit/SKILL.md +312 -344
  128. package/pipeline/skills/shared/external/pdfkit/evals/evals.json +19 -19
  129. package/pipeline/skills/shared/external/pdfkit/references/pdfkit-patterns.md +413 -624
  130. package/pipeline/skills/shared/external/pencilkit-drawing/SKILL.md +242 -358
  131. package/pipeline/skills/shared/external/pencilkit-drawing/evals/evals.json +25 -21
  132. package/pipeline/skills/shared/external/pencilkit-drawing/references/pencilkit-patterns.md +161 -226
  133. package/pipeline/skills/shared/external/permissionkit/SKILL.md +282 -400
  134. package/pipeline/skills/shared/external/permissionkit/evals/evals.json +27 -30
  135. package/pipeline/skills/shared/external/permissionkit/references/permissionkit-patterns.md +237 -350
  136. package/pipeline/skills/shared/external/photos-camera-media/SKILL.md +276 -325
  137. package/pipeline/skills/shared/external/photos-camera-media/references/av-playback.md +299 -545
  138. package/pipeline/skills/shared/external/photos-camera-media/references/camera-capture.md +344 -588
  139. package/pipeline/skills/shared/external/photos-camera-media/references/image-loading-caching.md +316 -660
  140. package/pipeline/skills/shared/external/photos-camera-media/references/photokit-patterns.md +270 -416
  141. package/pipeline/skills/shared/external/push-notifications/SKILL.md +312 -340
  142. package/pipeline/skills/shared/external/push-notifications/evals/evals.json +27 -26
  143. package/pipeline/skills/shared/external/push-notifications/references/notification-patterns.md +328 -485
  144. package/pipeline/skills/shared/external/push-notifications/references/rich-notifications.md +327 -560
  145. package/pipeline/skills/shared/external/realitykit-ar/SKILL.md +218 -410
  146. package/pipeline/skills/shared/external/realitykit-ar/evals/evals.json +24 -27
  147. package/pipeline/skills/shared/external/realitykit-ar/references/realitykit-patterns.md +221 -348
  148. package/pipeline/skills/shared/external/shareplay-activities/SKILL.md +222 -393
  149. package/pipeline/skills/shared/external/shareplay-activities/evals/evals.json +23 -24
  150. package/pipeline/skills/shared/external/shareplay-activities/references/shareplay-patterns.md +280 -420
  151. package/pipeline/skills/shared/external/speech-recognition/SKILL.md +217 -421
  152. package/pipeline/skills/shared/external/speech-recognition/evals/evals.json +23 -26
  153. package/pipeline/skills/shared/external/speech-recognition/references/speechanalyzer-patterns.md +133 -125
  154. package/pipeline/skills/shared/external/storekit/SKILL.md +228 -204
  155. package/pipeline/skills/shared/external/storekit/evals/evals.json +27 -24
  156. package/pipeline/skills/shared/external/storekit/references/app-review-guidelines.md +98 -109
  157. package/pipeline/skills/shared/external/storekit/references/core-patterns.md +298 -242
  158. package/pipeline/skills/shared/external/storekit/references/storekit-advanced.md +356 -649
  159. package/pipeline/skills/shared/external/swift-api-design-guidelines/SKILL.md +274 -399
  160. package/pipeline/skills/shared/external/swift-api-design-guidelines/evals/evals.json +22 -24
  161. package/pipeline/skills/shared/external/swift-api-design-guidelines/references/argument-labels-and-parameters.md +107 -108
  162. package/pipeline/skills/shared/external/swift-api-design-guidelines/references/conventions-and-special-rules.md +93 -165
  163. package/pipeline/skills/shared/external/swift-api-design-guidelines/references/naming-and-clarity.md +99 -137
  164. package/pipeline/skills/shared/external/swift-api-design-guidelines/references/side-effects-and-mutating-pairs.md +77 -120
  165. package/pipeline/skills/shared/external/swift-architecture/SKILL.md +334 -350
  166. package/pipeline/skills/shared/external/swift-architecture/evals/evals.json +22 -22
  167. package/pipeline/skills/shared/external/swift-charts/SKILL.md +208 -394
  168. package/pipeline/skills/shared/external/swift-charts/evals/evals.json +27 -30
  169. package/pipeline/skills/shared/external/swift-charts/references/charts-patterns.md +351 -762
  170. package/pipeline/skills/shared/external/swift-codable/SKILL.md +339 -343
  171. package/pipeline/skills/shared/external/swift-codable/evals/evals.json +20 -20
  172. package/pipeline/skills/shared/external/swift-concurrency/SKILL.md +303 -351
  173. package/pipeline/skills/shared/external/swift-concurrency/evals/evals.json +27 -24
  174. package/pipeline/skills/shared/external/swift-concurrency/references/approachable-concurrency.md +65 -80
  175. package/pipeline/skills/shared/external/swift-concurrency/references/async-algorithms.md +48 -84
  176. package/pipeline/skills/shared/external/swift-concurrency/references/bridging-interop.md +134 -79
  177. package/pipeline/skills/shared/external/swift-concurrency/references/concurrency-patterns.md +145 -167
  178. package/pipeline/skills/shared/external/swift-concurrency/references/diagnostics.md +62 -50
  179. package/pipeline/skills/shared/external/swift-concurrency/references/swiftui-concurrency.md +92 -121
  180. package/pipeline/skills/shared/external/swift-concurrency/references/synchronization-primitives.md +177 -241
  181. package/pipeline/skills/shared/external/swift-formatstyle/SKILL.md +258 -234
  182. package/pipeline/skills/shared/external/swift-language/SKILL.md +342 -382
  183. package/pipeline/skills/shared/external/swift-language/evals/evals.json +24 -27
  184. package/pipeline/skills/shared/external/swift-language/references/swift-attributes-interop.md +79 -56
  185. package/pipeline/skills/shared/external/swift-language/references/swift-patterns-extended.md +297 -340
  186. package/pipeline/skills/shared/external/swift-security/SKILL.md +180 -161
  187. package/pipeline/skills/shared/external/swift-security/evals/evals.json +25 -25
  188. package/pipeline/skills/shared/external/swift-security/references/biometric-authentication.md +314 -469
  189. package/pipeline/skills/shared/external/swift-security/references/certificate-trust.md +408 -476
  190. package/pipeline/skills/shared/external/swift-security/references/common-anti-patterns.md +260 -530
  191. package/pipeline/skills/shared/external/swift-security/references/compliance-owasp-mapping.md +270 -477
  192. package/pipeline/skills/shared/external/swift-security/references/credential-storage-patterns.md +573 -571
  193. package/pipeline/skills/shared/external/swift-security/references/cryptokit-public-key.md +370 -441
  194. package/pipeline/skills/shared/external/swift-security/references/cryptokit-symmetric.md +332 -433
  195. package/pipeline/skills/shared/external/swift-security/references/keychain-access-control.md +346 -468
  196. package/pipeline/skills/shared/external/swift-security/references/keychain-fundamentals.md +352 -472
  197. package/pipeline/skills/shared/external/swift-security/references/keychain-item-classes.md +431 -432
  198. package/pipeline/skills/shared/external/swift-security/references/keychain-sharing.md +328 -425
  199. package/pipeline/skills/shared/external/swift-security/references/migration-legacy-stores.md +341 -579
  200. package/pipeline/skills/shared/external/swift-security/references/secure-enclave.md +396 -457
  201. package/pipeline/skills/shared/external/swift-security/references/testing-security-code.md +354 -614
  202. package/pipeline/skills/shared/external/swift-testing/SKILL.md +188 -175
  203. package/pipeline/skills/shared/external/swift-testing/evals/evals.json +26 -24
  204. package/pipeline/skills/shared/external/swift-testing/references/testing-advanced.md +80 -84
  205. package/pipeline/skills/shared/external/swift-testing/references/testing-patterns.md +317 -433
  206. package/pipeline/skills/shared/external/swiftdata/SKILL.md +392 -256
  207. package/pipeline/skills/shared/external/swiftdata/evals/evals.json +24 -24
  208. package/pipeline/skills/shared/external/swiftdata/references/core-data-coexistence.md +206 -402
  209. package/pipeline/skills/shared/external/swiftdata/references/indexing.md +59 -52
  210. package/pipeline/skills/shared/external/swiftdata/references/predicate-pitfalls.md +57 -33
  211. package/pipeline/skills/shared/external/swiftdata/references/swiftdata-advanced.md +354 -747
  212. package/pipeline/skills/shared/external/swiftdata/references/swiftdata-queries.md +300 -508
  213. package/pipeline/skills/shared/external/swiftlint/SKILL.md +175 -226
  214. package/pipeline/skills/shared/external/swiftlint/references/adoption-and-configuration.md +141 -208
  215. package/pipeline/skills/shared/external/swiftlint/references/custom-rules-and-analyze.md +100 -109
  216. package/pipeline/skills/shared/external/swiftlint/references/plugins-run-scripts-and-integrations.md +159 -179
  217. package/pipeline/skills/shared/external/swiftlint/references/rule-reference.md +383 -18
  218. package/pipeline/skills/shared/external/swiftlint/references/rules-suppressions-and-baselines.md +143 -229
  219. package/pipeline/skills/shared/external/swiftui-animation/SKILL.md +283 -366
  220. package/pipeline/skills/shared/external/swiftui-animation/references/animation-advanced.md +396 -608
  221. package/pipeline/skills/shared/external/swiftui-animation/references/core-animation-bridge.md +336 -385
  222. package/pipeline/skills/shared/external/swiftui-gestures/SKILL.md +239 -349
  223. package/pipeline/skills/shared/external/swiftui-gestures/references/gesture-patterns.md +228 -310
  224. package/pipeline/skills/shared/external/swiftui-layout-components/SKILL.md +260 -249
  225. package/pipeline/skills/shared/external/swiftui-layout-components/references/form.md +92 -74
  226. package/pipeline/skills/shared/external/swiftui-layout-components/references/grids.md +112 -177
  227. package/pipeline/skills/shared/external/swiftui-layout-components/references/list.md +61 -64
  228. package/pipeline/skills/shared/external/swiftui-layout-components/references/scrollview.md +94 -134
  229. package/pipeline/skills/shared/external/swiftui-liquid-glass/SKILL.md +193 -225
  230. package/pipeline/skills/shared/external/swiftui-liquid-glass/references/liquid-glass.md +173 -327
  231. package/pipeline/skills/shared/external/swiftui-navigation/SKILL.md +193 -168
  232. package/pipeline/skills/shared/external/swiftui-navigation/references/deeplinks.md +127 -150
  233. package/pipeline/skills/shared/external/swiftui-navigation/references/navigationstack.md +132 -133
  234. package/pipeline/skills/shared/external/swiftui-navigation/references/sheets.md +152 -117
  235. package/pipeline/skills/shared/external/swiftui-navigation/references/tabview.md +106 -140
  236. package/pipeline/skills/shared/external/swiftui-patterns/SKILL.md +316 -252
  237. package/pipeline/skills/shared/external/swiftui-patterns/references/architecture-patterns.md +341 -332
  238. package/pipeline/skills/shared/external/swiftui-patterns/references/deprecated-migration.md +547 -854
  239. package/pipeline/skills/shared/external/swiftui-patterns/references/design-polish.md +485 -537
  240. package/pipeline/skills/shared/external/swiftui-patterns/references/platform-and-sharing.md +417 -499
  241. package/pipeline/skills/shared/external/swiftui-performance/SKILL.md +213 -376
  242. package/pipeline/skills/shared/external/swiftui-performance/references/demystify-swiftui-performance-wwdc23.md +86 -175
  243. package/pipeline/skills/shared/external/swiftui-performance/references/optimizing-swiftui-performance-instruments.md +89 -195
  244. package/pipeline/skills/shared/external/swiftui-performance/references/understanding-hangs-in-your-app.md +95 -182
  245. package/pipeline/skills/shared/external/swiftui-performance/references/understanding-improving-swiftui-performance.md +71 -149
  246. package/pipeline/skills/shared/external/swiftui-performance/references/wwdc-session-sources.md +21 -27
  247. package/pipeline/skills/shared/external/swiftui-uikit-interop/SKILL.md +303 -295
  248. package/pipeline/skills/shared/external/swiftui-uikit-interop/references/hosting-migration.md +204 -387
  249. package/pipeline/skills/shared/external/swiftui-uikit-interop/references/representable-recipes.md +469 -683
  250. package/pipeline/skills/shared/external/swiftui-webkit/SKILL.md +140 -186
  251. package/pipeline/skills/shared/external/swiftui-webkit/references/loading-and-observation.md +75 -86
  252. package/pipeline/skills/shared/external/swiftui-webkit/references/local-content-and-custom-schemes.md +63 -60
  253. package/pipeline/skills/shared/external/swiftui-webkit/references/migration-and-fallbacks.md +69 -137
  254. package/pipeline/skills/shared/external/swiftui-webkit/references/navigation-and-javascript.md +95 -67
  255. package/pipeline/skills/shared/external/tipkit/SKILL.md +220 -335
  256. package/pipeline/skills/shared/external/tipkit/references/tipkit-patterns.md +356 -494
  257. package/pipeline/skills/shared/external/vision-framework/SKILL.md +260 -375
  258. package/pipeline/skills/shared/external/vision-framework/references/vision-requests.md +393 -515
  259. package/pipeline/skills/shared/external/vision-framework/references/visionkit-scanner.md +363 -539
  260. package/pipeline/skills/shared/external/weatherkit/SKILL.md +152 -310
  261. package/pipeline/skills/shared/external/weatherkit/references/weatherkit-patterns.md +288 -407
  262. package/pipeline/skills/shared/external/widgetkit/SKILL.md +216 -288
  263. package/pipeline/skills/shared/external/widgetkit/references/widgetkit-advanced.md +414 -719
  264. package/pipeline/skills/shared/external/NOTICE-swift-ios-skills.md +0 -39
@@ -1,363 +1,344 @@
1
1
  ---
2
2
  name: app-store-review
3
- description: "Prepare for App Store review and prevent rejections. Covers App Store review guidelines, app rejection reasons, PrivacyInfo.xcprivacy privacy manifest requirements, required API reason codes, in-app purchase IAP and StoreKit rules, App Store Guidelines compliance, ATT App Tracking Transparency, EU DMA Digital Markets Act, HIG compliance checklist, app submission preparation, review preparation, metadata requirements, entitlements, widgets, and Live Activities review rules. Use when preparing for App Store submission, fixing rejection reasons, auditing privacy manifests, implementing ATT consent flow, configuring StoreKit IAP, or checking HIG compliance."
3
+ description: "App Store submission readiness and rejection prevention: Review Guidelines 2.1, 2.3, 2.5.1, 3.1.1, 4.2 and 5.1.2, PrivacyInfo.xcprivacy manifests and required-reason codes, IAP and StoreKit rules, ATT consent, EU DMA distribution, entitlements and usage strings, metadata limits, screenshots, TestFlight, phased release, Resolution Center appeals, HIG review items, widget and Live Activity review rules. Use when preparing a submission, fixing a rejection, auditing a privacy manifest, implementing the ATT prompt or checking IAP compliance. Not for keyword research, ranking, conversion copy, screenshot order or A/B tests (app-store-optimization)."
4
4
  metadata:
5
- source: "dpearson2699/swift-ios-skills (PolyForm Perimeter 1.0.0)"
5
+ source: multi-agent-pipeline
6
6
  ---
7
7
 
8
- # App Store Review Preparation
8
+ # App Store Review Readiness
9
9
 
10
- Guidance for catching App Store rejection risks before submission. Apple's May 2026 fraud-prevention update says App Review evaluated more than 9.1 million submissions in 2025 and rejected more than 2 million, so treat rejection prevention as a normal release-readiness step and re-check official Apple sources before quoting annual statistics.
10
+ Most rejections are predictable. They come from a missing demo account, a
11
+ privacy declaration that disagrees with what the binary actually sends, a
12
+ purchase path that skips StoreKit, or metadata that promises something the app
13
+ does not do. This skill finds those before App Review does.
11
14
 
12
- ## Contents
15
+ Apple's fraud-prevention report of May 2026 said App Review looked at more than
16
+ 9.1 million submissions during 2025 and turned down over 2 million of them.
17
+ Numbers like these change every year, so confirm them against Apple's own
18
+ publication before quoting them.
13
19
 
14
- - [Overview](#overview)
15
- - [Top Rejection Reasons and How to Avoid Them](#top-rejection-reasons-and-how-to-avoid-them)
16
- - [PrivacyInfo.xcprivacy -- Privacy Manifest Requirements](#privacyinfoxcprivacy-privacy-manifest-requirements)
17
- - [Data Use, Sharing, and Privacy Policy (Guideline 5.1.2)](#data-use-sharing-and-privacy-policy-guideline-512)
18
- - [In-App Purchase and StoreKit Rules (Guideline 3.1.1)](#in-app-purchase-and-storekit-rules-guideline-311)
19
- - [HIG Compliance Checklist](#hig-compliance-checklist)
20
- - [App Tracking Transparency (ATT)](#app-tracking-transparency-att)
21
- - [EU Digital Markets Act (DMA) Considerations](#eu-digital-markets-act-dma-considerations)
22
- - [Entitlements and Capabilities](#entitlements-and-capabilities)
23
- - [Submission Workflow](#submission-workflow)
24
- - [Metadata Best Practices](#metadata-best-practices)
25
- - [Appeal Process](#appeal-process)
26
- - [Common Mistakes](#common-mistakes)
27
- - [Review Checklist](#review-checklist)
28
- - [References](#references)
20
+ ## Scope and boundaries
29
21
 
30
- ## Overview
22
+ - Metadata questions (name, subtitle, keywords, captions, product page) are
23
+ answered here only from the compliance side: accuracy, field limits,
24
+ misleading content and screenshot rules.
25
+ - Keyword research, ranking strategy, conversion copy, screenshot order and
26
+ A/B tests belong to `app-store-optimization`.
27
+ - Clean Swift 6 concurrency or a tidy StoreKit wrapper is not evidence of
28
+ compliance. Check the guideline, not the code quality.
31
29
 
32
- Use this SKILL.md for quick guidance on common rejection reasons and key policies. Use the references for detailed checklists and privacy manifest specifics.
30
+ Limits to state on every metadata answer:
33
31
 
34
- For prompts about keywords, screenshot captions, product-page metadata, or metadata rejection risk, answer from a compliance angle and explicitly defer keyword research, ranking strategy, conversion optimization, screenshot ordering, and A/B testing to `app-store-optimization`. Keep App Review metadata guidance limited to accuracy, field limits, misleading-content risk, and screenshot compliance. Always surface the rejection-prone format checks: app name 30 characters, subtitle 30 characters, keyword field 100 characters with comma-separated keywords and no spaces after commas, screenshots showing actual app UI, 6.9-inch iPhone screenshots as the primary current iPhone set, and 13-inch iPad screenshots when the app runs on iPad.
35
-
36
- For full submission readiness audits, separate blocking upload/review issues from ordinary cleanup. Treat Xcode 26+ with the relevant platform SDK 26+ as a blocking App Store Connect upload requirement after April 28, 2026. Cross-check privacy manifests, App Store privacy nutrition labels, privacy policy, ATT state, runtime network behavior, and SDK behavior against each other; the declarations and observed behavior must align.
37
-
38
- ### Blocking Submission Checks
39
-
40
- Escalate these as blockers before ordinary cleanup:
41
-
42
- - Uploads after April 28, 2026 that are not built with Xcode 26+ and the relevant platform SDK 26+
43
- - Privacy manifest, privacy label, privacy policy, ATT state, SDK transmissions, or audited runtime network behavior mismatches
44
- - Digital goods and subscriptions that bypass StoreKit IAP, or external purchase paths/links/buttons/CTAs for digital goods, unless current rules or approved entitlements allow them
45
- - Missing required screenshot sets: 6.9-inch iPhone screenshots, and 13-inch iPad screenshots when the app runs on iPad
46
- - Login-gated or non-obvious features without demo credentials, demo mode, and clear App Review notes
47
-
48
- ## Top Rejection Reasons and How to Avoid Them
49
-
50
- ### Guideline 2.1 -- App Completeness
51
-
52
- The app must be fully functional when reviewed. Apple rejects for:
53
-
54
- - Placeholder content, lorem ipsum, or test data visible anywhere
55
- - Broken links or empty screens
56
- - Features behind logins without demo credentials provided in App Review notes
57
- - Features that require hardware Apple does not have access to
58
-
59
- **Prevention:**
60
- - Provide demo account credentials in the App Review Information notes field in App Store Connect
61
- - Walk through every screen and verify real content is present
62
- - Test all flows end-to-end, including edge cases like empty states and error conditions
63
-
64
- ### Guideline 2.3 -- Accurate Metadata
65
-
66
- - App name must match what the app actually does
67
- - Screenshots must show the actual app UI, not marketing renders or mockups
68
- - Description must not contain prices (they vary by region)
69
- - No references to other platforms ("Also available on Android")
70
- - Keywords must be relevant -- no competitor names or unrelated terms
71
- - Category must match the app's primary function
72
-
73
- ### Guideline 4.2 -- Minimum Functionality
74
-
75
- Apple rejects apps that are too simple or are just websites in a wrapper:
76
-
77
- - WKWebView-only apps are rejected unless they add meaningful native functionality
78
- - Single-feature apps may be rejected if the feature is better suited as part of another app
79
- - Apps that duplicate built-in iOS functionality without significant improvement are rejected
80
-
81
- ### Guideline 2.5.1 -- Software Requirements
82
-
83
- - Must use public APIs only -- private API usage is an instant rejection
84
- - As of April 28, 2026, uploads to App Store Connect must be built with Xcode 26 or later using the relevant platform SDK 26 or later
85
- - Deployment target support is a product and compatibility decision, not an App Review rule
86
- - Must not download or execute code that introduces or changes app features or functionality after review, except where Apple guidelines and agreements explicitly allow interpreted code
87
-
88
- ## PrivacyInfo.xcprivacy -- Privacy Manifest Requirements
89
-
90
- A privacy manifest is required when your app code, an executable, a dynamic library, or a third-party SDK uses Apple's required-reason API categories or declares collected data/tracking behavior.
91
-
92
- **See:** [references/privacy-manifest.md](references/privacy-manifest.md) for the full structure, reason codes, and checklists.
93
-
94
- ### Summary
95
-
96
- - Required-reason API categories are file timestamps, system boot time, disk space, active keyboards, and UserDefaults; each requires an approved reason code when used.
97
- - Before final submission, re-check Apple's current required-reason API documentation and do not choose broad, convenient, or invented reason codes.
98
- - Required-reason API declarations belong in the bundle that contains the code using the API; every app target, executable, dynamic library, framework, or SDK bundle containing manifest-relevant code needs the matching manifest declarations.
99
- - Each SDK, executable, or dynamic library that collects data, uses required-reason APIs, enables data collection/tracking, or contacts tracking domains needs manifest attention in the bundle containing that code; SDK code cannot rely on the host app's manifest to report the SDK's own usage.
100
- - Manifest declarations must match App Store privacy nutrition labels, SDK behavior, and the app's presented functionality.
101
-
102
- ## Data Use, Sharing, and Privacy Policy (Guideline 5.1.2)
103
-
104
- - A privacy policy URL must be set in App Store Connect AND accessible within the app
105
- - The privacy policy must accurately describe what data you collect, how you use it, and who you share it with
106
- - App Store privacy nutrition labels must match your actual data collection practices
107
- - Privacy labels, privacy manifests, SDK disclosures, and runtime behavior should tell the same story
108
-
109
- ## In-App Purchase and StoreKit Rules (Guideline 3.1.1)
110
-
111
- IAP rules are strict and heavily enforced.
112
-
113
- ### What Generally Requires Apple IAP
114
-
115
- Digital content, features, subscriptions, and services unlocked in the app generally must use Apple's In-App Purchase system unless a specific App Review guideline exception, regional rule, or approved entitlement applies. Remove external purchase paths unless the current rules or an approved entitlement allow them:
116
-
117
- - Premium features or content unlocks
118
- - Subscriptions to app functionality
119
- - Virtual currency, coins, gems
120
- - Ad removal
121
- - Digital tips or donations
122
-
123
- ### What Does NOT Require IAP
124
-
125
- - Physical products (e-commerce)
126
- - Ride-sharing, food delivery, real-world services
127
- - One-to-one services (tutoring, consulting booked through the app)
128
- - Enterprise/B2B apps distributed through Apple Business Manager
129
-
130
- ### Subscription Display Requirements
131
-
132
- - Price, duration, and auto-renewal terms must be clearly displayed before purchase
133
- - Free trials must clearly show trial duration, post-trial price, billing frequency, auto-renewal, and cancellation terms before purchase
134
- - Remove external purchase links, buttons, calls to action, or purchase paths for digital goods unless the current storefront rules or an approved entitlement explicitly allow them
135
- - "Reader" apps (Netflix, Spotify) may link to external sign-up but cannot offer IAP bypass
136
-
137
- ### StoreKit Implementation Checklist
138
-
139
- - Consumables, non-consumables, and subscriptions must be correctly categorized in App Store Connect
140
- - Restore purchases functionality must be present and working
141
- - Transaction verification should use StoreKit 2 `Transaction.currentEntitlements` or server-side validation
142
- - Handle interrupted purchases, deferred transactions, and ask-to-buy gracefully
143
-
144
- ## HIG Compliance Checklist
145
-
146
- See [references/review-checklists.md](references/review-checklists.md) for the full HIG checklist (navigation, modals, widgets, system feature support, launch screen, empty states). This section stays intentionally brief to keep SKILL.md concise.
147
-
148
- ## App Tracking Transparency (ATT)
149
-
150
- ### When ATT Is Required
151
-
152
- If your app tracks users across other companies' apps or websites, you must:
153
-
154
- 1. Request permission via `ATTrackingManager.requestTrackingAuthorization` before any cross-app or cross-website tracking occurs, including tracking-capable SDK behavior
155
- 2. Respect the user's choice -- disable cross-app and cross-website tracking if the user denies permission
156
- 3. Not gate app functionality behind tracking consent ("Accept tracking or you cannot use this app" is rejected)
157
- 4. Provide a clear purpose string in `NSUserTrackingUsageDescription` explaining what tracking is used for
158
-
159
- ### When ATT Is NOT Required
160
-
161
- If you do not track users across apps or websites, do not show the ATT prompt. Apple rejects unnecessary ATT prompts.
162
-
163
- ### ATT Implementation
32
+ | Field | Rule |
33
+ |---|---|
34
+ | App name | 30 characters |
35
+ | Subtitle | 30 characters |
36
+ | Keyword field | 100 characters, comma-separated, no space after a comma |
37
+ | iPhone screenshots | 6.9-inch set is the primary set |
38
+ | iPad screenshots | 13-inch set for any app that supports iPad |
39
+ | Screenshot content | the real app UI |
40
+
41
+ ## Triage: blockers first
42
+
43
+ A full audit reports two lists: things that stop upload or review, and cleanup.
44
+ Treat these as blockers:
45
+
46
+ 1. The build is uploaded after April 28, 2026 and was not produced with Xcode 26
47
+ or later against the platform's 26 SDK or later.
48
+ 2. The privacy manifest, the nutrition label, the privacy policy, the ATT state,
49
+ what bundled SDKs transmit and what the app does on the network (audited at
50
+ runtime) do not tell the same story.
51
+ 3. Digital goods or subscriptions are sold outside StoreKit IAP, or the app shows
52
+ an outside checkout (link, button, call to action or any other route) for
53
+ them, without a storefront rule or granted entitlement that allows it.
54
+ 4. The 6.9-inch iPhone screenshot set is missing, or the 13-inch iPad set is
55
+ missing for an app that runs on iPad.
56
+ 5. Features behind a login, or features a reviewer would not find alone, ship
57
+ with no demo credentials, no demo mode and no App Review notes.
58
+
59
+ Everything else (copy polish, an optional screenshot, a HIG nit) is cleanup.
60
+
61
+ ## Guidelines that cause most rejections
62
+
63
+ ### 2.1 App Completeness
64
+
65
+ Rejected: placeholder text, lorem ipsum or visible test records; broken links and
66
+ empty screens; login-gated features with no demo credentials in the review notes;
67
+ features that need hardware Apple does not have.
68
+
69
+ Prevent it: put working demo credentials in the notes field under App Review
70
+ Information in App Store Connect, walk every screen to confirm real content, and
71
+ run every flow from start to finish including its empty and error states.
72
+
73
+ ### 2.3 Accurate Metadata
74
+
75
+ - The name reflects what the app does. Screenshots show the running app, not a
76
+ marketing render or device mockup of screens that do not exist.
77
+ - Leave prices out of the description; they differ per storefront.
78
+ - Do not mention other platforms (for example, "also on Android").
79
+ - Keywords describe the app itself; competitor names and off-topic terms do not
80
+ belong. The primary
81
+ category must match the main function.
82
+
83
+ ### 4.2 Minimum Functionality
84
+
85
+ - A shell around `WKWebView` is rejected unless it adds meaningful native
86
+ features.
87
+ - A single-feature app can be rejected when it would fit better inside another
88
+ app.
89
+ - Recreating a built-in iOS feature without a significant improvement is
90
+ rejected.
91
+
92
+ ### 2.5.1 Software Requirements
93
+
94
+ - Public APIs only. Private API use is rejected outright.
95
+ - From April 28, 2026, uploads need Xcode 26+ and the matching 26+ platform SDK.
96
+ - The minimum deployment target is a product and compatibility choice; App
97
+ Review does not set it.
98
+ - The app may not download or run code that adds or changes features after
99
+ review. The exception is interpreted code that Apple's guidelines and
100
+ agreements explicitly allow.
101
+
102
+ ## Privacy manifest in brief
103
+
104
+ `PrivacyInfo.xcprivacy` is needed whenever code in the app, in an executable, in
105
+ a dylib or in a vendor SDK calls a required-reason API, or when that code
106
+ collects data or tracks. Five API categories carry this requirement (boot time,
107
+ `UserDefaults`, file timestamps, free disk space and the list of active
108
+ keyboards), and every use needs an approved reason code.
109
+
110
+ - Pick the code that describes the actual use. Never pick a broad or convenient
111
+ one, and never make one up. Re-read Apple's current list before each release.
112
+ - Declare the use inside whichever bundle ships the calling code: app target,
113
+ executable, dylib, framework or SDK bundle. An SDK cannot lean on the host
114
+ app's manifest for its own calls.
115
+ - The manifest has to agree with the nutrition label, with SDK behaviour and with
116
+ the features the app presents.
117
+
118
+ Codes, plist layout and SDK rules: [privacy manifest reference](references/privacy-manifest.md).
119
+
120
+ ## 5.1.2 Privacy policy and data disclosure
121
+
122
+ - The policy URL appears in App Store Connect, and the app links to the same
123
+ policy from its own UI.
124
+ - The policy describes what is collected, why, and who receives it.
125
+ - Nutrition labels reflect real collection. Labels, manifests, SDK disclosures
126
+ and runtime behaviour must all agree.
127
+
128
+ ## 3.1.1 Paying for digital things
129
+
130
+ When the app unlocks digital content, a feature, a subscription or a digital
131
+ service, the sale normally runs through Apple IAP, unless a guideline exception, a regional rule or
132
+ an approved entitlement says otherwise.
133
+
134
+ | Needs IAP | Does not need IAP |
135
+ |---|---|
136
+ | Unlocking premium features | Physical goods |
137
+ | Subscriptions to app functionality | Real-world services such as rides or food delivery |
138
+ | Virtual currency | Person-to-person services, for example a live tutor or consultant |
139
+ | Removing ads | Business apps for organizations, distributed as custom apps via Apple Business Manager |
140
+ | Digital tips to creators | Donations to approved nonprofits (see 3.2.1 and 3.2.2) |
141
+
142
+ Rules around the purchase:
143
+
144
+ - Before a subscription is bought, the paywall states what it costs, how long a
145
+ period lasts and that it renews on its own.
146
+ - For a free trial, show the trial length, the price after it, how often billing
147
+ happens, that it renews automatically, and how to cancel, all before purchase.
148
+ - Strip any route to an outside checkout for digital goods, whether a link, a
149
+ button or a nudge in copy, unless the storefront's current rule or a granted
150
+ entitlement permits it. These rules differ by region and have changed recently; read the
151
+ current 3.1.1(a) and 3.1.3 text for the target storefront.
152
+ - Reader apps may link out to account sign-up with the matching entitlement, but
153
+ may not offer a way around IAP for in-app purchases.
154
+
155
+ StoreKit checks:
156
+
157
+ - Products are typed correctly in App Store Connect (consumable, non-consumable,
158
+ subscription).
159
+ - A Restore Purchases control exists and works.
160
+ - Entitlements are verified with StoreKit 2 `Transaction.currentEntitlements` or
161
+ on the server.
162
+ - A purchase that is interrupted, or deferred while a parent approves it through
163
+ Ask to Buy, leaves the UI in a sane state.
164
+
165
+ ## HIG items App Review looks at
166
+
167
+ Navigation, modals, system features and widgets are listed in the
168
+ [HIG section of the checklists](references/review-checklists.md#hig-compliance-checklist);
169
+ launch screen and empty-state rules sit in the Design block of the
170
+ [pre-submission list](references/review-checklists.md#pre-submission-checklist).
171
+
172
+ ## App Tracking Transparency
173
+
174
+ - Tracking a user across other companies' apps or sites, SDK tracking included,
175
+ needs `ATTrackingManager.requestTrackingAuthorization` to return authorized
176
+ first.
177
+ - If the user says no, turn that tracking off.
178
+ - Never lock a feature behind tracking consent; that is rejected.
179
+ - Add an `NSUserTrackingUsageDescription` string.
180
+ - An app that does not track must not show the prompt. Apple rejects needless
181
+ prompts.
164
182
 
165
183
  ```swift
166
184
  import AppTrackingTransparency
167
185
 
186
+ protocol AdServing {
187
+ func configure(personalized: Bool)
188
+ }
189
+
168
190
  @MainActor
169
- func requestTrackingPermission() async {
191
+ func resolveAdPersonalization(using ads: AdServing) async {
170
192
  let status = await ATTrackingManager.requestTrackingAuthorization()
171
193
  switch status {
172
194
  case .authorized:
173
- // Enable tracking, initialize ad SDKs with tracking
174
- break
195
+ ads.configure(personalized: true)
175
196
  case .denied, .restricted:
176
- // Use non-personalized ads and disable cross-app/cross-website tracking
177
- break
197
+ ads.configure(personalized: false)
178
198
  case .notDetermined:
179
- // Should not happen after request, handle gracefully
180
- break
199
+ ads.configure(personalized: false)
181
200
  @unknown default:
182
- break
201
+ ads.configure(personalized: false)
183
202
  }
184
203
  }
185
204
  ```
186
205
 
187
- **Timing:** Request ATT permission after the app is active and the user has context for why tracking is being requested. Do not show the prompt immediately on first launch or stack it with another system permission prompt.
188
-
189
- ## EU Digital Markets Act (DMA) Considerations
206
+ `.notDetermined` can come back when the app was not active; keep the safe
207
+ default and ask again later. Ask only when the app is in the foreground
208
+ and the user can see why, never as the first thing on first launch, and never right
209
+ behind another system permission alert.
190
210
 
191
- For apps distributed in the EU, and for other region-specific distribution models as Apple updates them:
211
+ ## EU Digital Markets Act
192
212
 
193
- - Alternative browser engines are permitted on iOS in the EU
194
- - Alternative app marketplaces exist -- apps may be distributed outside the App Store
195
- - External payment links may be allowed under specific conditions, with Apple's commission structure adjusted
196
- - Notarization is required even for sideloaded apps distributed outside the App Store
197
- - Apps using alternative distribution must still meet Apple's notarization requirements for security
213
+ - Alternative browser engines are allowed on iOS in the EU.
214
+ - Alternative app marketplaces and web distribution exist, so an app can ship
215
+ outside the App Store there.
216
+ - External payment links can be allowed, under conditions and with a different
217
+ commission.
218
+ - An app shipped through a marketplace or the web still goes through Apple's iOS
219
+ notarization and must meet its security requirements.
198
220
 
199
- ## Entitlements and Capabilities
221
+ ## Entitlements and usage strings
200
222
 
201
- Every entitlement must be justified. Apple reviews these closely:
223
+ Every entitlement needs a reason App Review can see in the product.
202
224
 
203
- | Entitlement | Apple Scrutiny |
225
+ | Capability | What review expects |
204
226
  |---|---|
205
- | Camera | Must explain purpose in `NSCameraUsageDescription` |
206
- | Location (Always) | Must have clear, user-visible reason for background location |
207
- | Push Notifications | Must not be used for marketing without user opt-in |
208
- | HealthKit | Must actually use health data in a meaningful way |
209
- | Background Modes | Each mode (audio, location, VoIP, fetch) must be justified and actively used |
210
- | App Groups | Must explain what shared data is needed |
211
- | Associated Domains | Universal links must actually resolve and function |
212
-
213
- ### Usage Description Strings
214
-
215
- Usage descriptions in Info.plist must be specific about what data is accessed and why:
216
-
217
- ```xml
218
- // REJECTED -- too vague
219
-
220
- // APPROVED -- specific purpose
221
- "Your location is used to show nearby restaurants on the map."
222
-
223
- // REJECTED -- too vague
224
- "This app needs access to your camera."
225
-
226
- // APPROVED -- specific purpose
227
- "The camera is used to scan barcodes for price comparison."
228
- ```
229
-
230
- Apple rejects vague usage descriptions. Always state what the data is used for in user-facing terms.
231
-
232
- ## Submission Workflow
233
-
234
- ### Pre-Submission Steps
235
-
236
- 1. **Archive in Xcode.** Product > Archive (requires a Distribution signing identity). Verify the archive builds clean with zero warnings in Release configuration.
237
- 2. **Upload to App Store Connect.** Use the Organizer window (Distribute App > App Store Connect) or `xcodebuild -exportArchive`. Automated uploads via `altool` or Transporter also work.
238
- 3. **TestFlight internal testing.** The build is available to internal testers (your team) within minutes of processing. Walk through every screen and flow on at least two device sizes.
239
- 4. **TestFlight external testing.** External groups require Beta App Review before first external distribution. Use this to validate with real users before full submission.
240
- 5. **Submit for App Review.** In App Store Connect, select the build, fill in all metadata fields, attach screenshots, and click Submit for Review. Review timing varies; allow buffer for rejections, appeals, and metadata fixes.
241
-
242
- ### Expedited Review Requests
243
-
244
- Apple grants expedited reviews for critical situations only:
245
-
246
- - Critical bug fix affecting existing users
247
- - Time-sensitive event (holiday launch, legal compliance deadline)
248
- - Security vulnerability patch
249
-
250
- Request via the Contact Us form in App Store Connect (App Review > Expedite Request). Provide a specific, factual justification. Do not request expedited review for initial launches or feature updates.
251
-
252
- ### Phased Release
253
-
254
- After approval, you can enable phased release to gradually roll out the update:
255
-
256
- | Day | Percentage of Users |
257
- |-----|---------------------|
258
- | 1 | 1% |
259
- | 2 | 2% |
260
- | 3 | 5% |
261
- | 4 | 10% |
262
- | 5 | 20% |
263
- | 6 | 50% |
264
- | 7 | 100% |
265
-
266
- Users who manually check for updates in the App Store will receive the update immediately regardless of phased release stage. You can pause, resume, or complete the rollout at any time from App Store Connect.
267
-
268
- ## Metadata Best Practices
227
+ | Camera | a clear `NSCameraUsageDescription` |
228
+ | Location (Always) | a visible reason the user benefits from background location |
229
+ | Push notifications | no marketing pushes without the user's opt-in |
230
+ | HealthKit | health data used in a meaningful feature |
231
+ | Background Modes | every declared mode (audio, location, VoIP, fetch) has a feature that uses it |
232
+ | App Groups | the shared data is explained |
233
+ | Associated Domains | universal links resolve and open the app |
269
234
 
270
- ### App Name and Subtitle
235
+ A usage string names the data and the user-facing reason:
271
236
 
272
- - **30 characters max** for the app name. Keep it memorable and unique.
273
- - **30 characters max** for the subtitle. Use it for a concise value proposition.
274
- - No generic terms that describe a category ("Photo Editor" alone is likely rejected).
275
- - No competitor names or trademarked terms you do not own.
276
- - No pricing information in the name or subtitle.
277
- - Name must be unique on the App Store -- Apple rejects duplicates.
278
-
279
- ### Screenshot Requirements
280
-
281
- - Provide 1-10 screenshots per required platform and localization.
282
- - For iPhone, use the current App Store Connect screenshot specifications. As of May 2026, 6.9-inch iPhone screenshots are the primary accepted iPhone set; 6.5-inch screenshots are required only when 6.9-inch screenshots are not provided, and smaller iPhone displays can use scaled screenshots from larger sets.
283
- - For iPad apps, 13-inch iPad screenshots are required; smaller iPad displays can use scaled screenshots from larger sets.
284
- - Screenshots must show the **actual app UI** -- no misleading content, no features that do not exist.
285
- - Text overlays and marketing frames are allowed but must not obscure or misrepresent the actual interface.
286
- - Up to 10 screenshots per localization.
287
- - Screenshots for different localizations should show localized UI.
288
-
289
- ### Keyword Field Compliance
290
-
291
- - 100-character limit, comma-separated, no spaces after commas.
292
- - Do not duplicate words already in your app name or subtitle (Apple indexes those automatically).
293
- - Use singular or plural, not both ("game" not "game,games").
294
- - No competitor names, trademarked terms, or irrelevant words.
295
-
296
- ### App Preview Videos
297
-
298
- - **30 seconds max** per preview video.
299
- - Up to 3 preview videos per localization.
300
- - Must show the actual app running on device -- no pre-rendered animations of features that look different in practice.
301
- - App audio is captured; narration and background music are optional.
302
- - Avoid any framing, hand footage, or visual treatment that makes the preview misleading about the actual app experience.
303
- - First frame is used as the poster frame on the product page (choose carefully).
304
-
305
- ## Appeal Process
306
-
307
- ### Replying to Rejections
308
-
309
- All rejections appear in the **Resolution Center** in App Store Connect. To respond:
310
-
311
- 1. Read the rejection message carefully -- it cites the specific guideline violated.
312
- 2. Reply directly in the Resolution Center thread with a clear, factual explanation.
313
- 3. If you made a fix, describe exactly what changed and resubmit the binary.
314
- 4. If you believe the rejection is incorrect, explain why your app complies, with references to the specific guideline text.
315
-
316
- **Tone matters.** Be professional, specific, and concise. Provide demo credentials, screenshots, or screen recordings that demonstrate compliance. Avoid emotional language or threats.
317
-
318
- ### Escalation to App Review Board
319
-
320
- If the Resolution Center exchange does not resolve the issue:
321
-
322
- 1. Request an appeal to the **App Review Board** via the Resolution Center or the App Store Contact form (App Review > Appeal).
323
- 2. The Board is a separate team from the original reviewer. Provide all context -- they review the full history.
324
- 3. Board decisions are final for that submission, but you can always modify the app and resubmit.
325
-
326
- ### Common Successful Appeal Strategies
327
-
328
- - **Provide a video walkthrough** showing the feature the reviewer could not find or access.
329
- - **Cite the specific guideline** and explain how the app satisfies each requirement.
330
- - **Include demo credentials** if the reviewer could not log in (the most common 2.1 rejection cause).
331
- - **Reference precedent** -- if similar apps exist on the App Store with the same pattern, note them (respectfully).
332
- - **Offer a compromise** -- if Apple objects to a specific implementation, propose an alternative that satisfies both sides.
333
-
334
- ## Common Mistakes
335
-
336
- 1. **Missing demo credentials.** Provide App Review login credentials in App Store Connect notes. Most Guideline 2.1 rejections are from reviewers unable to test behind a login.
337
- 2. **Privacy manifest mismatch.** Declared data collection in PrivacyInfo.xcprivacy must match App Store privacy nutrition labels, SDK behavior, and app functionality.
338
- 3. **Unnecessary ATT prompt.** Do not show the App Tracking Transparency prompt unless you actually track users across apps or websites. Apple rejects unnecessary prompts.
339
- 4. **Vague usage descriptions.** "This app needs your location" is rejected. State the specific feature that uses the data.
340
- 5. **Unapproved external purchase paths.** External payment links for digital goods are region- and entitlement-sensitive; do not add them without checking current Guideline 3.1.1(a) rules.
341
- 6. **Treating code quality as review compliance.** Swift 6 concurrency annotations and StoreKit transaction handling matter, but they do not replace privacy, payment, metadata, and entitlement compliance checks.
342
-
343
- ## Review Checklist
344
-
345
- Quick-check before every submission (full version in [references/review-checklists.md](references/review-checklists.md)):
346
-
347
- - [ ] No placeholder/test content; all features functional; demo credentials provided
348
- - [ ] App name matches functionality; screenshots are real; no prices in description; 6.9-inch iPhone and 13-inch iPad screenshots supplied when applicable
349
- - [ ] PrivacyInfo.xcprivacy present when required-reason APIs, tracking, collected data declarations, or SDK tracking domains apply; nutrition labels match reality
350
- - [ ] Privacy policy URL set and accessible in-app
351
- - [ ] Digital content uses IAP; subscription terms visible; restore purchases works; external purchase links/buttons/CTAs removed unless current rules or approved entitlements allow them
352
- - [ ] Dark Mode and Dynamic Type supported; standard navigation patterns
353
- - [ ] Built with Xcode 26+ and platform SDK 26+ for uploads after April 28, 2026; no private APIs; entitlements justified
354
- - [ ] ATT prompt only if cross-app or cross-website tracking occurs
237
+ | Verdict | String |
238
+ |---|---|
239
+ | Approved | "We use where you are to place the closest charging stations on the map." |
240
+ | Approved | "The camera scans a book's barcode so you can add it to your shelf." |
241
+ | Rejected | "This app requires camera access." |
242
+ | Rejected | "We use your photo library to improve your experience." |
243
+ | Fixed | "Pick a photo from your library to use as your profile picture. Only the photo you choose is uploaded." |
244
+
245
+ The second rejected string names a data type but gives no concrete purpose;
246
+ "improve your experience" is the phrase review flags. The fixed version says
247
+ which feature uses the data and what leaves the device.
248
+
249
+ ## Submission workflow
250
+
251
+ 1. Archive: Product > Archive with a Distribution signing identity, from a clean
252
+ Release build. Aim for zero warnings; it is good hygiene, not a review rule.
253
+ 2. Upload: in Organizer choose Distribute App, then App Store Connect; or run
254
+ `xcodebuild -exportArchive`. `altool` and Transporter also work.
255
+ 3. Internal TestFlight: internal testers see the build minutes after processing.
256
+ Try every flow on two or more screen sizes.
257
+ 4. External TestFlight: the first build sent to an external group goes through
258
+ Beta App Review.
259
+ 5. Submit: pick the build, complete metadata, attach screenshots, press Submit
260
+ for Review. Review time varies, so keep slack before a deadline.
261
+
262
+ Expedited review is for a critical fix for existing users, a date-bound event
263
+ (a holiday launch, a legal deadline) or a security patch. Ask through Contact
264
+ Us > App Review > Expedite Request with a specific, factual reason. It is not for
265
+ first launches or new features.
266
+
267
+ Phased release for automatic updates: day 1 1%, day 2 2%, day 3 5%, day 4 10%,
268
+ day 5 20%, day 6 50%, day 7 100%. Users who check for updates by hand get the
269
+ build immediately. The rollout can be paused, resumed or finished early at any
270
+ time.
271
+
272
+ ## Metadata rules
273
+
274
+ - Name and subtitle: 30 characters each. The subtitle is a short value statement.
275
+ A bare category word such as "Photo Editor" is likely rejected; so are
276
+ competitor or trademarked terms and prices. The name must be unique.
277
+ - Screenshots: 1 to 10 per required platform and localization. As of May 2026,
278
+ the 6.9-inch iPhone set is the primary one; the 6.5-inch set is required only
279
+ when there is no 6.9-inch set, and smaller iPhones get scaled images. Apps that
280
+ run on iPad need 13-inch iPad screenshots; smaller iPads are scaled.
281
+ - Screenshot content: the real UI; never show a feature the build lacks. Captions and
282
+ frames are fine if they neither hide nor misstate the UI. Localized sets show
283
+ the localized UI.
284
+ - Keywords: 100 characters, comma-separated with no spaces. Words already in the
285
+ name or subtitle are indexed, so do not repeat them. Use singular or plural,
286
+ not both. No competitor, trademark or unrelated terms.
287
+ - App previews: up to 30 seconds, up to 3 per localization, captured from the app
288
+ on a device with the app's own audio (narration or music optional). No
289
+ misleading framing and no footage of hands holding a device. The first frame
290
+ is the poster frame.
291
+
292
+ ## Rejections and appeals
293
+
294
+ - A rejection arrives in the Resolution Center with the guideline number.
295
+ - Reply in that thread with facts. If you fixed the issue, say what changed and
296
+ upload a new binary. If you disagree, show how the app complies, quoting the
297
+ guideline.
298
+ - Keep it professional, specific and short. Attach demo credentials, screenshots
299
+ or a screen recording. No emotional language, no threats.
300
+ - For a formal appeal, go to the App Review Board through the Resolution Center or
301
+ Contact Us > App Review > Appeal. A separate team reads the whole history. The
302
+ ruling is final for that build; a changed build can still be submitted.
303
+
304
+ What tends to work: a video walkthrough of the flagged feature, a point-by-point
305
+ answer against the guideline text, fresh demo credentials (the usual 2.1 cause),
306
+ a polite reference to comparable approved behaviour, and offering an alternative
307
+ implementation.
308
+
309
+ ## Common mistakes
310
+
311
+ 1. No demo credentials; this drives most 2.1 rejections.
312
+ 2. The manifest disagrees with the nutrition label, an SDK, or the features.
313
+ 3. An ATT prompt in an app that does not track.
314
+ 4. Vague usage descriptions.
315
+ 5. External purchase routes without an approved path. This depends on region and
316
+ entitlement, so read the current 3.1.1(a).
317
+ 6. Treating good code (Swift 6 concurrency, careful StoreKit handling) as proof
318
+ of compliance.
319
+
320
+ ## Review checklist
321
+
322
+ - [ ] No placeholder or test content; every feature works; demo credentials given
323
+ - [ ] Name matches function; real screenshots; no prices in the description;
324
+ 6.9-inch iPhone set, plus 13-inch iPad set for iPad-capable apps
325
+ - [ ] Privacy manifest present wherever required-reason APIs, tracking, collected
326
+ data or SDK tracking domains apply; labels agree with it
327
+ - [ ] Privacy policy URL in App Store Connect and inside the app
328
+ - [ ] IAP for digital content; terms shown before purchase; restore works; no
329
+ external purchase CTAs unless allowed
330
+ - [ ] Standard navigation; the UI holds up in Dark Mode and at large Dynamic Type
331
+ - [ ] Toolchain is Xcode 26+ with a 26+ SDK (required from April 28, 2026); no
332
+ private APIs; every entitlement justified
333
+ - [ ] ATT prompt only if the app tracks
334
+
335
+ Full lists: [review checklists](references/review-checklists.md).
355
336
 
356
337
  ## References
357
338
 
358
- - Review checklists: [references/review-checklists.md](references/review-checklists.md)
359
- - Privacy manifest guide: [references/privacy-manifest.md](references/privacy-manifest.md)
360
- - Apple App Review Guidelines: https://developer.apple.com/app-store/review/guidelines/
361
- - Apple upcoming SDK requirements: https://developer.apple.com/news/upcoming-requirements/
362
- - App Store Connect screenshot specifications: https://developer.apple.com/help/app-store-connect/reference/app-information/screenshot-specifications/
363
- - Sosumi required-reason API docs: https://sosumi.ai/documentation/bundleresources/describing-use-of-required-reason-api
339
+ - Guidelines text: https://developer.apple.com/app-store/review/guidelines/
340
+ - SDK and Xcode deadlines: https://developer.apple.com/news/upcoming-requirements/
341
+ - Screenshot sizes: https://developer.apple.com/help/app-store-connect/reference/screenshot-specifications/
342
+ - Reason-code documentation: https://developer.apple.com/documentation/bundleresources/describing-use-of-required-reason-api
343
+ - [Privacy manifest reference](references/privacy-manifest.md)
344
+ - [Review checklists](references/review-checklists.md)