@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,395 +1,247 @@
1
- # Instruments Guide Reference
2
-
3
- Detailed template-by-template guide for profiling iOS apps with Instruments. Companion to the main `debugging-instruments` skill.
4
-
5
- ## Contents
6
-
7
- - [General Workflow](#general-workflow)
8
- - [Time Profiler](#time-profiler)
9
- - [Allocations](#allocations)
10
- - [Leaks](#leaks)
11
- - [Network](#network)
12
- - [SwiftUI Instruments](#swiftui-instruments)
13
- - [Animation Hitches and Core Animation](#animation-hitches-and-core-animation)
14
- - [Power Profiler](#power-profiler)
15
- - [File Activity](#file-activity)
16
- - [System Trace](#system-trace)
17
- - [xctrace CLI](#xctrace-cli)
18
- - [Custom Instruments with os_signpost](#custom-instruments-with-os_signpost)
19
- - [Automation and CI Integration](#automation-and-ci-integration)
20
-
21
- ## General Workflow
22
-
23
- 1. **Build for profiling**: Product > Profile (Cmd+I). This builds with Release optimization by default.
24
- 2. **Select a template** from the Instruments chooser.
25
- 3. **Configure recording**: Set the target device and process.
26
- 4. **Record**: Press the red record button and reproduce the scenario.
27
- 5. **Analyze**: Use the timeline, detail views, and call tree to find issues.
28
- 6. **Filter**: Check "Hide System Libraries" and use the search bar to focus on your code.
29
-
30
- Always profile on a **physical device** for accurate measurements. Simulator
31
- performance does not reflect real-world behavior.
1
+ # Instruments Guide
32
2
 
33
- ## Time Profiler
34
-
35
- **When to use**: CPU is high, UI is slow, animations stutter, or you need to
36
- find which functions consume the most time.
37
-
38
- ### Key Workflow
3
+ Companion to the `debugging-instruments` skill: what each template is for, how
4
+ to read it, and how to drive recordings from scripts.
39
5
 
40
- 1. Record while reproducing the slow interaction.
41
- 2. Select the time range of interest in the timeline.
42
- 3. Switch to the **Call Tree** view in the detail pane.
43
- 4. Enable these checkboxes:
44
- - **Separate by Thread** - isolate main thread vs background
45
- - **Invert Call Tree** - show leaf functions (actual work) first
46
- - **Hide System Libraries** - focus on your code
47
- 5. Sort by **Weight** (self time) to find the hottest functions.
48
- 6. Double-click a function to view source with per-line timing.
6
+ ## Workflow That Fits Every Template
49
7
 
50
- ### Reading the Call Tree
8
+ Product > Profile (Cmd+I) builds the app for profiling, which uses the Release
9
+ configuration unless the scheme says otherwise. Then:
51
10
 
52
- - **Weight**: total time in this function and all its callees
53
- - **Self Weight**: time spent in this function alone (not callees)
54
- - **Symbol Name**: the function - look for your module prefix
11
+ 1. Choose a template.
12
+ 2. Pick the device and the process to launch or attach to.
13
+ 3. Record while you reproduce the problem.
14
+ 4. Read the timeline, the detail pane and the call tree.
15
+ 5. Narrow the data with Hide System Libraries and the search field.
55
16
 
56
- Focus on functions with high **Self Weight** - these are doing the actual work.
17
+ Profile on a physical device. Simulator runs on the Mac's CPU and memory and
18
+ does not tell you how the app performs on a phone.
57
19
 
58
- ### Tips
59
-
60
- - Profile the same user interaction 3 times to get stable measurements.
61
- - Use the **Comparison** view to diff traces before/after a fix.
62
- - Check "Flatten Recursion" if recursive calls make the tree hard to read.
63
-
64
- ## Allocations
20
+ ## Time Profiler
65
21
 
66
- **When to use**: Memory grows over time, you suspect objects are not being
67
- freed, or you need to track object lifetimes.
22
+ Use it for high CPU, slow screens, stuttering animations and for finding the
23
+ most expensive functions.
68
24
 
69
- ### Key Workflow
25
+ Reading the call tree:
70
26
 
71
- 1. Record while reproducing the scenario.
72
- 2. Use **Mark Generation** (button in the detail pane) to snapshot allocations
73
- at specific points. For example:
74
- - Mark before navigating to a screen
75
- - Navigate to the screen
76
- - Navigate back
77
- - Mark again
78
- - The difference shows objects that were not freed
79
- 3. Expand a generation to see allocations grouped by category.
80
- 4. Filter by your module name to exclude system allocations.
27
+ 1. Drag across the timeline to select the slow period.
28
+ 2. Open the Call Tree and turn on Separate by Thread, Invert Call Tree (leaf
29
+ functions first) and Hide System Libraries.
30
+ 3. Sort by Weight and double-click a function to see its source with per-line
31
+ cost.
81
32
 
82
- ### Allocation Lifespan
33
+ Weight is time spent in the function including its callees; Self Weight counts
34
+ only the function's own code. Functions with a high Self Weight are the ones
35
+ doing the work.
83
36
 
84
- - **Created & Still Living**: objects allocated and not yet freed
85
- - **Created & Destroyed**: objects with normal lifetimes
86
- - **Persistent**: long-lived allocations (singletons, caches)
87
- - **Transient**: short-lived allocations (autoreleased, temporary)
37
+ Tips:
38
+ - Perform the interaction three times so the numbers settle.
39
+ - Record before and after a change and diff them in the comparison view.
40
+ - Flatten Recursion collapses deep recursive trees into one entry.
88
41
 
89
- Focus on "Created & Still Living" objects in the generation diff - these
90
- are your potential leaks.
42
+ ## Allocations
91
43
 
92
- ### Heap Growth Analysis
44
+ Generation analysis:
93
45
 
94
- Enable the **Allocations List** and sort by **Persistent Bytes**. Look for:
95
- - Classes with unexpectedly high instance counts
96
- - Image data or NSData objects that should have been released
97
- - View controllers that persist after dismissal
46
+ 1. Click Mark Generation.
47
+ 2. Open the screen under suspicion.
48
+ 3. Leave it again.
49
+ 4. Click Mark Generation once more.
98
50
 
99
- ## Leaks
51
+ The second generation holds what the round trip left behind. Expand it to see
52
+ allocations grouped by category and filter by your module name.
100
53
 
101
- **When to use**: Suspected retain cycles or abandoned memory.
54
+ Lifespan filters:
102
55
 
103
- ### Key Workflow
56
+ | Category | Meaning |
57
+ |----------|---------|
58
+ | Created & Still Living | Allocated in the range and still alive |
59
+ | Created & Destroyed | Allocated and freed in the range |
60
+ | Persistent | Long-lived by design: singletons, caches |
61
+ | Transient | Short-lived temporaries and autoreleased objects |
104
62
 
105
- 1. Run with the Leaks template.
106
- 2. The tool automatically checks for leaks every 10 seconds.
107
- 3. Red "Leak" markers appear in the timeline when leaks are detected.
108
- 4. Click a leak marker to see the leaked object and its retain/release history.
109
- 5. The **Cycles & Roots** view shows the reference graph - follow the arrows
110
- to find the cycle.
63
+ In a generation diff, "Created & Still Living" is where leaks hide.
111
64
 
112
- ### Interpreting Results
65
+ For overall heap growth, sort the Allocations List by Persistent Bytes. Watch
66
+ for types with surprisingly high counts, images or `Data` buffers that are
67
+ never released, and view controllers that outlive their dismissal.
113
68
 
114
- - **Leak**: an object with no references pointing to it (true orphan)
115
- - **Root Leak**: the object at the head of a leaked object graph
116
- - **Cycles & Roots graph**: arrows show retain relationships - look for
117
- bidirectional arrows indicating a cycle
69
+ ## Leaks
118
70
 
119
- ### Common Cycle Patterns
71
+ - A leak check runs automatically every 10 seconds.
72
+ - Red markers on the timeline show where leaks were found; click one to see the
73
+ object and its retain and release history.
74
+ - Cycles & Roots draws the reference graph; arrows in both directions mean a
75
+ cycle.
76
+ - A *leak* is an object nothing refers to any more; a *root leak* is the top of
77
+ a leaked object graph.
120
78
 
121
- Leaks instrument commonly catches:
122
- - Closure -> self -> closure cycles
123
- - Delegate strong reference cycles
124
- - NotificationCenter observer blocks retaining self
125
- - CADisplayLink/Timer retaining target
79
+ Cycles this usually finds: a closure stored on an object that captures that
80
+ object, strong delegate references, block-based `NotificationCenter` observers
81
+ that capture `self`, and `CADisplayLink` or `Timer` retaining its target.
126
82
 
127
83
  ## Network
128
84
 
129
- **When to use**: Inspecting HTTP request/response timing, payload sizes,
130
- or connection reuse.
131
-
132
- ### Key Workflow
85
+ Each HTTP request appears as a bar on the timeline. Selecting one shows the
86
+ URL, method, status code, headers, a timing split (DNS, connect, TLS, request,
87
+ response) and the payload size.
133
88
 
134
- 1. Record with the Network template.
135
- 2. Each HTTP request appears as a bar in the timeline.
136
- 3. Select a request to see:
137
- - URL, method, status code
138
- - Request/response headers
139
- - Timing breakdown (DNS, connect, TLS, request, response)
140
- - Payload size
89
+ What to look for:
90
+ - Gaps in a waterfall where requests run one after another but could run in
91
+ parallel.
92
+ - Large responses that need pagination or compression.
93
+ - The same request sent more than once.
94
+ - Slow DNS or TLS setup that connection prewarming could hide.
141
95
 
142
- ### What to Look For
96
+ ## SwiftUI
143
97
 
144
- - **Waterfall gaps**: sequential requests that could be parallelized
145
- - **Large payloads**: responses that could use pagination or compression
146
- - **Redundant requests**: duplicate calls to the same endpoint
147
- - **DNS/TLS latency**: consider connection prewarming
98
+ Use it for bodies that run too often, redraws with no visible change, and list
99
+ rows whose identity keeps changing.
148
100
 
149
- ## SwiftUI Instruments
101
+ Lanes to read:
102
+ - **Update Groups**: batches of work SwiftUI performed together.
103
+ - **Long View Body Updates**: bodies that took longer than the threshold.
104
+ - **Cause and Effect Graph**: the chain of changes that made a view update.
150
105
 
151
- **When to use**: SwiftUI view body is evaluated too frequently, unnecessary
152
- redraws, or identity churn in lists.
153
-
154
- ### Key Workflow
155
-
156
- 1. Select the **SwiftUI** template in Instruments.
157
- 2. Record while interacting with the UI.
158
- 3. Check these lanes:
159
- - **Update Groups**: shows batches of view updates triggered together
160
- - **Long View Body Updates**: highlights body evaluations exceeding a time threshold
161
- - **Cause and Effect Graph**: traces why a view was re-evaluated
162
- 4. Look for views with excessive body evaluations during a single interaction.
163
-
164
- ### Tips
165
-
166
- - Filter by view name to focus on a specific component.
167
- - Cross-reference with Time Profiler to see if body evaluations are expensive.
168
- - See the `swiftui-performance` skill for remediation patterns.
106
+ Filter by view name and cross-check hot spots against Time Profiler. How to fix
107
+ what you find belongs to the `swiftui-performance` skill.
169
108
 
170
109
  ## Animation Hitches and Core Animation
171
110
 
172
- **When to use**: Frame drops, off-screen rendering, excessive blending.
173
-
174
- ### Key Workflow
175
-
176
- 1. Record with the **Animation Hitches** template on a real device when the
177
- symptom is stutter or missed frames.
178
- 2. Add Core Animation instruments such as **Core Animation FPS**,
179
- **Core Animation Commits**, or **Core Animation Activity** when you need
180
- lower-level render pipeline detail.
181
- 3. Check FPS, hitches, commits, and frame lifetime lanes for drops or long
182
- commit/render work.
183
- 4. Enable these debug options in Recording Options or Xcode view debugging:
184
- - **Color Blended Layers** - red areas have multiple overlapping layers
185
- - **Color Off-screen Rendered** - yellow areas use off-screen passes
186
- - **Color Hits Green and Misses Red** - rasterization cache hits/misses
111
+ Record Animation Hitches on a real device when scrolling or animations stutter
112
+ or frames are missed. For lower-level rendering detail add Core Animation FPS,
113
+ Core Animation Commits or Core Animation Activity, and read the FPS, hitch,
114
+ commit and frame-lifetime lanes.
187
115
 
188
- ### Common Issues
116
+ Rendering diagnostics live in Xcode (Debug > View Debugging > Rendering) and
117
+ in Simulator's Debug menu rather than in current Instruments:
118
+ - **Color Blended Layers**: overlapping translucent layers show in red.
119
+ - **Color Off-screen Rendered**: layers rendered off screen show in yellow.
120
+ - **Color Hits Green and Misses Red**: rasterization cache hits and misses.
189
121
 
190
- | Issue | Indicator | Fix |
191
- |-------|-----------|-----|
192
- | Transparent overlapping views | Red blended layers | Use opaque backgrounds |
193
- | Corner radius + clip | Off-screen rendering | Use `cornerCurve` with pre-masked images |
194
- | Shadow without path | Off-screen rendering | Set `shadowPath` explicitly |
195
- | Large images not downsampled | High memory + slow rendering | Downsample before display |
122
+ | Problem | Why it costs | Fix |
123
+ |---------|--------------|-----|
124
+ | Stacked transparent views | Blending, red in Color Blended Layers | Give views opaque backgrounds |
125
+ | Rounded corners with `masksToBounds` over image content | Off-screen pass | Round the image once before display, or avoid masking |
126
+ | Shadows without a path | Off-screen pass to find the shape | Set `shadowPath` |
127
+ | Full-size images in small views | Memory and decode cost | Downsample to display size first |
196
128
 
197
129
  ## Power Profiler
198
130
 
199
- **When to use**: Battery drain complaints, background energy impact, or
200
- App Store rejection for excessive energy use.
131
+ Use it for battery complaints, energy spent in the background, or an App Store
132
+ rejection that cites energy use. Record on a physical device.
201
133
 
202
- ### Key Workflow
134
+ Read the power, thermal state and energy impact lanes, and the per-component
135
+ split: CPU, network, location, GPU and background tasks.
203
136
 
204
- 1. Record with the **Power Profiler** template on a physical device.
205
- 2. Check power, thermal, and energy-impact lanes for high readings.
206
- 3. Examine component breakdown:
207
- - CPU
208
- - Network
209
- - Location
210
- - GPU
211
- - Background tasks
212
-
213
- ### Tips
214
-
215
- - Profile typical user sessions (5-10 minutes of real usage).
216
- - Compare foreground vs background energy impact.
217
- - Check that background tasks complete and do not run indefinitely.
218
- - Cross-reference with MetricKit energy metrics from production.
137
+ Tips:
138
+ - Record a realistic session of 5 to 10 minutes.
139
+ - Compare the app in the foreground with the app in the background.
140
+ - Make sure background tasks finish and stop.
141
+ - Cross-check against MetricKit energy metrics from the field.
219
142
 
220
143
  ## File Activity
221
144
 
222
- **When to use**: Slow file operations, excessive disk I/O, or disk write
223
- exceptions from MetricKit.
224
-
225
- ### Key Workflow
226
-
227
- 1. Record with the File Activity template.
228
- 2. Look for:
229
- - Frequent writes to the same file (journaling, logging)
230
- - Large reads on the main thread
231
- - Unintended file access patterns
145
+ Use it for slow file operations, heavy disk I/O and MetricKit disk-write
146
+ exceptions. Look for the same file written again and again, large reads on the
147
+ main thread and access patterns you did not expect.
232
148
 
233
149
  ## System Trace
234
150
 
235
- **When to use**: Deep investigation of thread scheduling, virtual memory
236
- faults, system calls, and inter-process communication.
237
-
238
- ### Key Workflow
151
+ Use it when you need to see thread scheduling, virtual memory faults, system
152
+ calls or IPC. Start from the main thread's lane and look for:
153
+ - threads blocked on locks, semaphores or dispatch queues,
154
+ - VM page faults,
155
+ - a high number of context switches.
239
156
 
240
- 1. Record with the System Trace template.
241
- 2. Focus on the main thread lane.
242
- 3. Look for:
243
- - **Thread blocks**: main thread waiting on locks, semaphores, or dispatch queues
244
- - **VM faults**: page faults from memory-mapped files or large allocations
245
- - **Context switches**: excessive switching between threads
157
+ It is the most detailed template. Reach for it after Time Profiler, when you
158
+ need to know what the operating system was doing.
246
159
 
247
- This is the most advanced template - use it after Time Profiler when you
248
- need OS-level detail.
249
-
250
- ## xctrace CLI
251
-
252
- ### Recording
253
-
254
- ```bash
255
- # Record Time Profiler trace
256
- xcrun xctrace record \
257
- --template "Time Profiler" \
258
- --device "iPhone" \
259
- --output ~/traces/profile.trace \
260
- --time-limit 30s \
261
- --launch -- /path/to/MyApp.app
262
-
263
- # Record Allocations trace for a running app
264
- xcrun xctrace record \
265
- --template "Allocations" \
266
- --device "iPhone" \
267
- --output ~/traces/alloc.trace \
268
- --attach MyApp
269
-
270
- # Record with multiple instruments
271
- xcrun xctrace record \
272
- --template "Time Profiler" \
273
- --instrument "Allocations" \
274
- --output ~/traces/combined.trace \
275
- --launch -- /path/to/MyApp.app
276
- ```
277
-
278
- ### Exporting Data
160
+ ## xctrace
279
161
 
280
162
  ```bash
281
- # List available tables in a trace
282
- xcrun xctrace export --input profile.trace --toc
283
-
284
- # Export specific table as XML
285
- xcrun xctrace export --input profile.trace \
286
- --xpath '/trace-toc/run/data/table[@schema="time-profile"]'
287
-
288
- # Export to a file
289
- xcrun xctrace export --input profile.trace \
290
- --xpath '/trace-toc/run/data/table[@schema="time-profile"]' \
291
- --output profile_data.xml
292
- ```
293
-
294
- ### Listing Resources
295
-
296
- ```bash
297
- # Available templates
298
- xcrun xctrace list templates
299
-
300
- # Connected devices
301
- xcrun xctrace list devices
302
-
303
- # Available instruments
163
+ xcrun xctrace record --template "Time Profiler" --time-limit 30s \
164
+ --output scroll.trace --launch -- /path/to/Atlas.app
165
+ xcrun xctrace record --template "Allocations" --attach Atlas --output memory.trace
166
+ xcrun xctrace export --input scroll.trace --toc
167
+ xcrun xctrace export --input scroll.trace \
168
+ --xpath '/trace-toc/run/data/table[@schema="time-profile"]' --output time-profile.xml
304
169
  xcrun xctrace list instruments
305
170
  ```
306
171
 
307
- ## Custom Instruments with os_signpost
172
+ - `--time-limit` stops the recording on its own.
173
+ - `--attach` records an app that is already running, instead of `--launch`.
174
+ - `--toc` lists the tables inside a trace; `--xpath` picks one to export.
308
175
 
309
- ### Emitting Signposts for Instruments
176
+ ## Custom Intervals with Signposts
310
177
 
311
178
  ```swift
312
179
  import os
313
180
 
314
- let signposter = OSSignposter(subsystem: "com.example.app", category: "Networking")
181
+ let signposter = OSSignposter(subsystem: "com.example.atlas", category: "Catalog")
315
182
 
316
- func fetchUser(id: String) async throws -> User {
317
- let signpostID = signposter.makeSignpostID()
318
- let state = signposter.beginInterval("fetchUser", id: signpostID)
319
- defer { signposter.endInterval("fetchUser", state) }
183
+ func loadCatalog(from url: URL) async throws -> [Product] {
184
+ let id = signposter.makeSignpostID()
185
+ let state = signposter.beginInterval("loadCatalog", id: id)
186
+ defer { signposter.endInterval("loadCatalog", state) }
320
187
 
321
- let (data, _) = try await URLSession.shared.data(from: userURL(id))
322
- signposter.emitEvent("dataReceived", id: signpostID, "\(data.count) bytes")
323
-
324
- return try JSONDecoder().decode(User.self, from: data)
188
+ let (data, _) = try await URLSession.shared.data(from: url)
189
+ signposter.emitEvent("downloaded", id: id, "\(data.count) bytes")
190
+ return try JSONDecoder().decode([Product].self, from: data)
325
191
  }
326
192
  ```
327
193
 
328
- ### Viewing in Instruments
329
-
330
- 1. Open Instruments with a Blank document, then add the **os_signpost**
331
- instrument, or start from a template that includes **Points of Interest**.
332
- 2. Your custom intervals appear as labeled bars in the timeline.
333
- 3. Events appear as point markers.
334
- 4. Filter by subsystem or category to isolate your signposts.
194
+ To see them, start from a Blank document and add the os_signpost instrument,
195
+ or use any template that includes Points of Interest. Intervals appear as
196
+ labelled bars and events as single markers; filter by subsystem and category.
335
197
 
336
- ### Integration with MetricKit
198
+ Signposts written to a log from `MXMetricManager.makeLogHandle(category:)` are
199
+ also counted in MetricKit payloads; the `metrickit-diagnostics` skill covers
200
+ that side.
337
201
 
338
- Signposts emitted through `MXMetricManager.makeLogHandle(category:)` are
339
- also reported in MetricKit payloads. See the `metrickit` skill
340
- for details on custom signpost metrics.
202
+ ## Automation and CI
341
203
 
342
- ## Automation and CI Integration
343
-
344
- ### Performance Baselines with xctrace
345
-
346
- Create a shell script for CI:
204
+ A script a CI job can run:
347
205
 
348
206
  ```bash
349
207
  #!/bin/bash
350
208
  set -euo pipefail
351
209
 
352
- APP_BUNDLE="build/MyApp.app"
353
- TRACE_OUTPUT="traces/ci_profile_$(date +%s).trace"
354
- TEMPLATE="Time Profiler"
355
-
356
- # Record trace
357
- xcrun xctrace record \
358
- --template "$TEMPLATE" \
359
- --output "$TRACE_OUTPUT" \
360
- --time-limit 60s \
361
- --launch -- "$APP_BUNDLE"
210
+ stamp=$(date +%Y%m%d-%H%M%S)
211
+ trace="traces/launch-$stamp.trace"
212
+ mkdir -p traces
362
213
 
363
- # Export data for analysis
364
- xcrun xctrace export \
365
- --input "$TRACE_OUTPUT" \
366
- --toc > "traces/toc.xml"
367
-
368
- echo "Trace saved to $TRACE_OUTPUT"
214
+ xcrun xctrace record --template "Time Profiler" --time-limit 60s \
215
+ --output "$trace" --launch -- "$APP_PATH"
216
+ xcrun xctrace export --input "$trace" --toc > "traces/launch-$stamp-toc.xml"
369
217
  ```
370
218
 
371
- ### XCTest Performance Metrics
372
-
373
- Complement Instruments with in-test measurements:
219
+ XCTest can measure a flow and compare it with a stored baseline:
374
220
 
375
221
  ```swift
376
- func testScrollPerformance() {
377
- let app = XCUIApplication()
378
- app.launch()
379
-
380
- let measureOptions = XCTMeasureOptions()
381
- measureOptions.iterationCount = 5
382
-
383
- measure(metrics: [
384
- XCTClockMetric(),
385
- XCTCPUMetric(),
386
- XCTMemoryMetric(),
387
- XCTStorageMetric()
388
- ], options: measureOptions) {
389
- app.swipeUp()
390
- app.swipeDown()
222
+ import XCTest
223
+
224
+ final class FeedScrollPerformanceTests: XCTestCase {
225
+ @MainActor
226
+ func testFeedScrolling() {
227
+ let app = XCUIApplication()
228
+ app.launch()
229
+
230
+ let options = XCTMeasureOptions()
231
+ options.iterationCount = 5
232
+
233
+ measure(metrics: [XCTClockMetric(),
234
+ XCTCPUMetric(application: app),
235
+ XCTMemoryMetric(application: app),
236
+ XCTStorageMetric(application: app)],
237
+ options: options) {
238
+ app.swipeUp()
239
+ app.swipeDown()
240
+ }
391
241
  }
392
242
  }
393
243
  ```
394
244
 
395
- Set performance baselines in Xcode to automatically flag regressions in CI.
245
+ `XCUIApplication` and its gestures are main-actor isolated, hence `@MainActor`
246
+ on the test method. Set a baseline for each measurement in Xcode's test report; later runs that
247
+ exceed it fail, so CI flags the regression without anyone reading traces.