@mmerterden/multi-agent-pipeline 20.7.0 → 20.8.1

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 (284) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/LICENSE +0 -10
  3. package/docs/facts.json +1 -1
  4. package/manifest.json +285 -285
  5. package/package.json +3 -3
  6. package/pipeline/lib/redact.mjs +3 -2
  7. package/pipeline/scripts/_notices.mjs +1 -1
  8. package/pipeline/scripts/gen-skills-index.mjs +13 -1
  9. package/pipeline/scripts/pre-commit-check.sh +4 -0
  10. package/pipeline/skills/.skill-manifest.json +69 -69
  11. package/pipeline/skills/shared/README.md +70 -70
  12. package/pipeline/skills/shared/external/alarmkit/SKILL.md +373 -381
  13. package/pipeline/skills/shared/external/alarmkit/evals/evals.json +23 -18
  14. package/pipeline/skills/shared/external/alarmkit/references/alarmkit-patterns.md +328 -378
  15. package/pipeline/skills/shared/external/app-clips/SKILL.md +260 -160
  16. package/pipeline/skills/shared/external/app-clips/evals/evals.json +27 -27
  17. package/pipeline/skills/shared/external/app-clips/references/data-handoff-notifications-location.md +150 -83
  18. package/pipeline/skills/shared/external/app-clips/references/routing-and-experiences.md +135 -83
  19. package/pipeline/skills/shared/external/app-clips/references/size-capabilities-and-promotion.md +143 -85
  20. package/pipeline/skills/shared/external/app-intents/SKILL.md +302 -304
  21. package/pipeline/skills/shared/external/app-intents/evals/evals.json +21 -21
  22. package/pipeline/skills/shared/external/app-intents/references/appintents-advanced.md +594 -894
  23. package/pipeline/skills/shared/external/app-store-optimization/SKILL.md +345 -277
  24. package/pipeline/skills/shared/external/app-store-optimization/evals/evals.json +27 -23
  25. package/pipeline/skills/shared/external/app-store-optimization/references/keyword-research-methodology.md +107 -121
  26. package/pipeline/skills/shared/external/app-store-optimization/references/product-page-variants.md +145 -165
  27. package/pipeline/skills/shared/external/app-store-review/SKILL.md +306 -326
  28. package/pipeline/skills/shared/external/app-store-review/evals/evals.json +21 -21
  29. package/pipeline/skills/shared/external/app-store-review/references/privacy-manifest.md +105 -67
  30. package/pipeline/skills/shared/external/app-store-review/references/review-checklists.md +114 -101
  31. package/pipeline/skills/shared/external/apple-on-device-ai/SKILL.md +335 -360
  32. package/pipeline/skills/shared/external/apple-on-device-ai/evals/evals.json +24 -27
  33. package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-conversion.md +215 -322
  34. package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-optimization.md +161 -256
  35. package/pipeline/skills/shared/external/apple-on-device-ai/references/foundation-models.md +277 -387
  36. package/pipeline/skills/shared/external/apple-on-device-ai/references/mlx-swift.md +196 -210
  37. package/pipeline/skills/shared/external/authentication/SKILL.md +277 -381
  38. package/pipeline/skills/shared/external/authentication/evals/evals.json +25 -25
  39. package/pipeline/skills/shared/external/authentication/references/keychain-biometric.md +135 -178
  40. package/pipeline/skills/shared/external/authentication/references/passkeys.md +111 -147
  41. package/pipeline/skills/shared/external/avkit/SKILL.md +267 -364
  42. package/pipeline/skills/shared/external/avkit/evals/evals.json +26 -26
  43. package/pipeline/skills/shared/external/avkit/references/avkit-patterns.md +375 -493
  44. package/pipeline/skills/shared/external/background-processing/SKILL.md +274 -384
  45. package/pipeline/skills/shared/external/background-processing/evals/evals.json +22 -22
  46. package/pipeline/skills/shared/external/background-processing/references/background-task-patterns.md +173 -321
  47. package/pipeline/skills/shared/external/callkit-voip/SKILL.md +290 -371
  48. package/pipeline/skills/shared/external/callkit-voip/evals/evals.json +24 -24
  49. package/pipeline/skills/shared/external/callkit-voip/references/callkit-patterns.md +175 -343
  50. package/pipeline/skills/shared/external/cloudkit-sync/SKILL.md +292 -381
  51. package/pipeline/skills/shared/external/cloudkit-sync/evals/evals.json +33 -30
  52. package/pipeline/skills/shared/external/cloudkit-sync/references/cloudkit-patterns.md +227 -355
  53. package/pipeline/skills/shared/external/contacts-framework/SKILL.md +197 -346
  54. package/pipeline/skills/shared/external/contacts-framework/evals/evals.json +19 -21
  55. package/pipeline/skills/shared/external/contacts-framework/references/contacts-patterns.md +169 -308
  56. package/pipeline/skills/shared/external/core-bluetooth/SKILL.md +228 -376
  57. package/pipeline/skills/shared/external/core-bluetooth/evals/evals.json +25 -22
  58. package/pipeline/skills/shared/external/core-bluetooth/references/ble-patterns.md +257 -337
  59. package/pipeline/skills/shared/external/core-data/SKILL.md +302 -368
  60. package/pipeline/skills/shared/external/core-data/evals/evals.json +30 -27
  61. package/pipeline/skills/shared/external/core-motion/SKILL.md +235 -324
  62. package/pipeline/skills/shared/external/core-motion/evals/evals.json +31 -27
  63. package/pipeline/skills/shared/external/core-motion/references/motion-patterns.md +210 -310
  64. package/pipeline/skills/shared/external/core-nfc/SKILL.md +292 -366
  65. package/pipeline/skills/shared/external/core-nfc/evals/evals.json +22 -24
  66. package/pipeline/skills/shared/external/core-nfc/references/nfc-patterns.md +233 -329
  67. package/pipeline/skills/shared/external/coreml/SKILL.md +323 -367
  68. package/pipeline/skills/shared/external/coreml/evals/evals.json +24 -21
  69. package/pipeline/skills/shared/external/coreml/references/coreml-swift-integration.md +562 -565
  70. package/pipeline/skills/shared/external/cryptokit/SKILL.md +253 -394
  71. package/pipeline/skills/shared/external/cryptokit/evals/evals.json +20 -18
  72. package/pipeline/skills/shared/external/cryptokit/references/cryptokit-patterns.md +299 -488
  73. package/pipeline/skills/shared/external/debugging-instruments/SKILL.md +270 -323
  74. package/pipeline/skills/shared/external/debugging-instruments/evals/evals.json +27 -30
  75. package/pipeline/skills/shared/external/debugging-instruments/references/instruments-guide.md +167 -315
  76. package/pipeline/skills/shared/external/debugging-instruments/references/lldb-patterns.md +140 -193
  77. package/pipeline/skills/shared/external/device-integrity/SKILL.md +236 -353
  78. package/pipeline/skills/shared/external/device-integrity/evals/evals.json +25 -21
  79. package/pipeline/skills/shared/external/device-integrity/references/device-integrity-patterns.md +159 -197
  80. package/pipeline/skills/shared/external/energykit/SKILL.md +225 -392
  81. package/pipeline/skills/shared/external/energykit/evals/evals.json +29 -28
  82. package/pipeline/skills/shared/external/energykit/references/energykit-patterns.md +174 -470
  83. package/pipeline/skills/shared/external/eventkit-calendar/SKILL.md +261 -383
  84. package/pipeline/skills/shared/external/eventkit-calendar/evals/evals.json +25 -22
  85. package/pipeline/skills/shared/external/eventkit-calendar/references/eventkit-patterns.md +165 -268
  86. package/pipeline/skills/shared/external/healthkit/SKILL.md +252 -303
  87. package/pipeline/skills/shared/external/healthkit/evals/evals.json +24 -23
  88. package/pipeline/skills/shared/external/healthkit/references/healthkit-patterns.md +369 -523
  89. package/pipeline/skills/shared/external/homekit-matter/SKILL.md +233 -348
  90. package/pipeline/skills/shared/external/homekit-matter/evals/evals.json +27 -22
  91. package/pipeline/skills/shared/external/homekit-matter/references/matter-commissioning.md +199 -305
  92. package/pipeline/skills/shared/external/ios-accessibility/SKILL.md +368 -340
  93. package/pipeline/skills/shared/external/ios-accessibility/evals/evals.json +28 -27
  94. package/pipeline/skills/shared/external/ios-accessibility/references/a11y-patterns.md +314 -260
  95. package/pipeline/skills/shared/external/ios-accessibility/references/media-accessibility.md +97 -67
  96. package/pipeline/skills/shared/external/ios-accessibility/references/nutrition-labels.md +165 -101
  97. package/pipeline/skills/shared/external/ios-localization/SKILL.md +258 -371
  98. package/pipeline/skills/shared/external/ios-localization/evals/evals.json +23 -23
  99. package/pipeline/skills/shared/external/ios-localization/references/formatstyle-locale.md +283 -491
  100. package/pipeline/skills/shared/external/ios-localization/references/string-catalogs.md +313 -440
  101. package/pipeline/skills/shared/external/ios-networking/SKILL.md +265 -341
  102. package/pipeline/skills/shared/external/ios-networking/evals/evals.json +24 -24
  103. package/pipeline/skills/shared/external/ios-networking/references/background-websocket.md +425 -652
  104. package/pipeline/skills/shared/external/ios-networking/references/file-storage-patterns.md +143 -285
  105. package/pipeline/skills/shared/external/ios-networking/references/lightweight-clients.md +93 -53
  106. package/pipeline/skills/shared/external/ios-networking/references/network-framework.md +231 -456
  107. package/pipeline/skills/shared/external/ios-networking/references/urlsession-patterns.md +517 -784
  108. package/pipeline/skills/shared/external/ios-simulator/SKILL.md +265 -393
  109. package/pipeline/skills/shared/external/ios-simulator/evals/evals.json +21 -21
  110. package/pipeline/skills/shared/external/ios-simulator/references/simctl-commands.md +177 -270
  111. package/pipeline/skills/shared/external/live-activities/SKILL.md +318 -360
  112. package/pipeline/skills/shared/external/live-activities/evals/evals.json +21 -21
  113. package/pipeline/skills/shared/external/live-activities/references/activitykit-patterns.md +478 -710
  114. package/pipeline/skills/shared/external/localization-reuse-map/SKILL.md +3 -3
  115. package/pipeline/skills/shared/external/localization-reuse-map/example-mapping.json +1 -1
  116. package/pipeline/skills/shared/external/localization-reuse-map/reference/format-and-output.md +8 -7
  117. package/pipeline/skills/shared/external/localization-reuse-map/reference/publish-and-snapshot.md +2 -2
  118. package/pipeline/skills/shared/external/localization-reuse-map/reference/sources-and-recipes.md +5 -2
  119. package/pipeline/skills/shared/external/localization-reuse-map/scripts/_shared.py +100 -0
  120. package/pipeline/skills/shared/external/localization-reuse-map/scripts/build-artifact.py +45 -26
  121. package/pipeline/skills/shared/external/localization-reuse-map/scripts/build-spreadsheet.py +14 -16
  122. package/pipeline/skills/shared/external/localization-reuse-map/scripts/fetch-annotations.py +12 -5
  123. package/pipeline/skills/shared/external/localization-reuse-map/scripts/fetch-legacy-labels.py +2 -1
  124. package/pipeline/skills/shared/external/localization-reuse-map/scripts/publish-confluence.py +6 -5
  125. package/pipeline/skills/shared/external/localization-reuse-map/scripts/render-overlay.py +44 -18
  126. package/pipeline/skills/shared/external/localization-reuse-map/scripts/resolve-legacy-values.py +5 -2
  127. package/pipeline/skills/shared/external/localization-reuse-map/scripts/resolve-new-values.py +10 -11
  128. package/pipeline/skills/shared/external/localization-reuse-map/scripts/scan-screen-keys.py +4 -33
  129. package/pipeline/skills/shared/external/localization-reuse-map/scripts/verify-map.py +12 -59
  130. package/pipeline/skills/shared/external/mapkit-location/SKILL.md +297 -267
  131. package/pipeline/skills/shared/external/mapkit-location/evals/evals.json +28 -24
  132. package/pipeline/skills/shared/external/mapkit-location/references/mapkit-corelocation-patterns.md +378 -532
  133. package/pipeline/skills/shared/external/mapkit-location/references/mapkit-patterns.md +397 -499
  134. package/pipeline/skills/shared/external/metrickit-diagnostics/SKILL.md +165 -348
  135. package/pipeline/skills/shared/external/metrickit-diagnostics/evals/evals.json +26 -23
  136. package/pipeline/skills/shared/external/metrickit-diagnostics/references/metrickit-patterns.md +123 -130
  137. package/pipeline/skills/shared/external/musickit-audio/SKILL.md +189 -315
  138. package/pipeline/skills/shared/external/musickit-audio/evals/evals.json +22 -21
  139. package/pipeline/skills/shared/external/musickit-audio/references/musickit-patterns.md +181 -270
  140. package/pipeline/skills/shared/external/natural-language/SKILL.md +188 -340
  141. package/pipeline/skills/shared/external/natural-language/evals/evals.json +21 -21
  142. package/pipeline/skills/shared/external/natural-language/references/translation-patterns.md +171 -225
  143. package/pipeline/skills/shared/external/passkit-wallet/SKILL.md +258 -392
  144. package/pipeline/skills/shared/external/passkit-wallet/evals/evals.json +30 -29
  145. package/pipeline/skills/shared/external/passkit-wallet/references/wallet-passes.md +164 -231
  146. package/pipeline/skills/shared/external/pdfkit/SKILL.md +312 -344
  147. package/pipeline/skills/shared/external/pdfkit/evals/evals.json +19 -19
  148. package/pipeline/skills/shared/external/pdfkit/references/pdfkit-patterns.md +413 -624
  149. package/pipeline/skills/shared/external/pencilkit-drawing/SKILL.md +242 -358
  150. package/pipeline/skills/shared/external/pencilkit-drawing/evals/evals.json +25 -21
  151. package/pipeline/skills/shared/external/pencilkit-drawing/references/pencilkit-patterns.md +161 -226
  152. package/pipeline/skills/shared/external/permissionkit/SKILL.md +282 -400
  153. package/pipeline/skills/shared/external/permissionkit/evals/evals.json +27 -30
  154. package/pipeline/skills/shared/external/permissionkit/references/permissionkit-patterns.md +237 -350
  155. package/pipeline/skills/shared/external/photos-camera-media/SKILL.md +276 -325
  156. package/pipeline/skills/shared/external/photos-camera-media/references/av-playback.md +299 -545
  157. package/pipeline/skills/shared/external/photos-camera-media/references/camera-capture.md +344 -588
  158. package/pipeline/skills/shared/external/photos-camera-media/references/image-loading-caching.md +316 -660
  159. package/pipeline/skills/shared/external/photos-camera-media/references/photokit-patterns.md +270 -416
  160. package/pipeline/skills/shared/external/push-notifications/SKILL.md +312 -340
  161. package/pipeline/skills/shared/external/push-notifications/evals/evals.json +27 -26
  162. package/pipeline/skills/shared/external/push-notifications/references/notification-patterns.md +328 -485
  163. package/pipeline/skills/shared/external/push-notifications/references/rich-notifications.md +327 -560
  164. package/pipeline/skills/shared/external/realitykit-ar/SKILL.md +218 -410
  165. package/pipeline/skills/shared/external/realitykit-ar/evals/evals.json +24 -27
  166. package/pipeline/skills/shared/external/realitykit-ar/references/realitykit-patterns.md +221 -348
  167. package/pipeline/skills/shared/external/shareplay-activities/SKILL.md +222 -393
  168. package/pipeline/skills/shared/external/shareplay-activities/evals/evals.json +23 -24
  169. package/pipeline/skills/shared/external/shareplay-activities/references/shareplay-patterns.md +280 -420
  170. package/pipeline/skills/shared/external/skill-creator/template.md +7 -1
  171. package/pipeline/skills/shared/external/speech-recognition/SKILL.md +217 -421
  172. package/pipeline/skills/shared/external/speech-recognition/evals/evals.json +23 -26
  173. package/pipeline/skills/shared/external/speech-recognition/references/speechanalyzer-patterns.md +133 -125
  174. package/pipeline/skills/shared/external/storekit/SKILL.md +228 -204
  175. package/pipeline/skills/shared/external/storekit/evals/evals.json +27 -24
  176. package/pipeline/skills/shared/external/storekit/references/app-review-guidelines.md +98 -109
  177. package/pipeline/skills/shared/external/storekit/references/core-patterns.md +302 -241
  178. package/pipeline/skills/shared/external/storekit/references/storekit-advanced.md +356 -649
  179. package/pipeline/skills/shared/external/swift-api-design-guidelines/SKILL.md +274 -399
  180. package/pipeline/skills/shared/external/swift-api-design-guidelines/evals/evals.json +22 -24
  181. package/pipeline/skills/shared/external/swift-api-design-guidelines/references/argument-labels-and-parameters.md +107 -108
  182. package/pipeline/skills/shared/external/swift-api-design-guidelines/references/conventions-and-special-rules.md +93 -165
  183. package/pipeline/skills/shared/external/swift-api-design-guidelines/references/naming-and-clarity.md +99 -137
  184. package/pipeline/skills/shared/external/swift-api-design-guidelines/references/side-effects-and-mutating-pairs.md +77 -120
  185. package/pipeline/skills/shared/external/swift-architecture/SKILL.md +334 -350
  186. package/pipeline/skills/shared/external/swift-architecture/evals/evals.json +22 -22
  187. package/pipeline/skills/shared/external/swift-charts/SKILL.md +208 -394
  188. package/pipeline/skills/shared/external/swift-charts/evals/evals.json +27 -30
  189. package/pipeline/skills/shared/external/swift-charts/references/charts-patterns.md +351 -762
  190. package/pipeline/skills/shared/external/swift-codable/SKILL.md +339 -343
  191. package/pipeline/skills/shared/external/swift-codable/evals/evals.json +20 -20
  192. package/pipeline/skills/shared/external/swift-concurrency/SKILL.md +304 -351
  193. package/pipeline/skills/shared/external/swift-concurrency/evals/evals.json +27 -24
  194. package/pipeline/skills/shared/external/swift-concurrency/references/approachable-concurrency.md +65 -80
  195. package/pipeline/skills/shared/external/swift-concurrency/references/async-algorithms.md +48 -84
  196. package/pipeline/skills/shared/external/swift-concurrency/references/bridging-interop.md +134 -79
  197. package/pipeline/skills/shared/external/swift-concurrency/references/concurrency-patterns.md +145 -167
  198. package/pipeline/skills/shared/external/swift-concurrency/references/diagnostics.md +62 -50
  199. package/pipeline/skills/shared/external/swift-concurrency/references/swiftui-concurrency.md +92 -121
  200. package/pipeline/skills/shared/external/swift-concurrency/references/synchronization-primitives.md +177 -241
  201. package/pipeline/skills/shared/external/swift-formatstyle/SKILL.md +258 -234
  202. package/pipeline/skills/shared/external/swift-language/SKILL.md +342 -382
  203. package/pipeline/skills/shared/external/swift-language/evals/evals.json +24 -27
  204. package/pipeline/skills/shared/external/swift-language/references/swift-attributes-interop.md +79 -56
  205. package/pipeline/skills/shared/external/swift-language/references/swift-patterns-extended.md +297 -340
  206. package/pipeline/skills/shared/external/swift-security/SKILL.md +183 -162
  207. package/pipeline/skills/shared/external/swift-security/evals/evals.json +25 -25
  208. package/pipeline/skills/shared/external/swift-security/references/biometric-authentication.md +314 -469
  209. package/pipeline/skills/shared/external/swift-security/references/certificate-trust.md +411 -476
  210. package/pipeline/skills/shared/external/swift-security/references/common-anti-patterns.md +260 -530
  211. package/pipeline/skills/shared/external/swift-security/references/compliance-owasp-mapping.md +270 -477
  212. package/pipeline/skills/shared/external/swift-security/references/credential-storage-patterns.md +573 -571
  213. package/pipeline/skills/shared/external/swift-security/references/cryptokit-public-key.md +370 -441
  214. package/pipeline/skills/shared/external/swift-security/references/cryptokit-symmetric.md +332 -433
  215. package/pipeline/skills/shared/external/swift-security/references/keychain-access-control.md +346 -468
  216. package/pipeline/skills/shared/external/swift-security/references/keychain-fundamentals.md +375 -491
  217. package/pipeline/skills/shared/external/swift-security/references/keychain-item-classes.md +431 -432
  218. package/pipeline/skills/shared/external/swift-security/references/keychain-sharing.md +328 -425
  219. package/pipeline/skills/shared/external/swift-security/references/migration-legacy-stores.md +341 -579
  220. package/pipeline/skills/shared/external/swift-security/references/secure-enclave.md +397 -457
  221. package/pipeline/skills/shared/external/swift-security/references/testing-security-code.md +354 -614
  222. package/pipeline/skills/shared/external/swift-testing/SKILL.md +191 -175
  223. package/pipeline/skills/shared/external/swift-testing/evals/evals.json +26 -24
  224. package/pipeline/skills/shared/external/swift-testing/references/testing-advanced.md +81 -84
  225. package/pipeline/skills/shared/external/swift-testing/references/testing-patterns.md +317 -433
  226. package/pipeline/skills/shared/external/swiftdata/SKILL.md +394 -256
  227. package/pipeline/skills/shared/external/swiftdata/evals/evals.json +24 -24
  228. package/pipeline/skills/shared/external/swiftdata/references/core-data-coexistence.md +206 -402
  229. package/pipeline/skills/shared/external/swiftdata/references/indexing.md +59 -52
  230. package/pipeline/skills/shared/external/swiftdata/references/predicate-pitfalls.md +57 -33
  231. package/pipeline/skills/shared/external/swiftdata/references/swiftdata-advanced.md +354 -747
  232. package/pipeline/skills/shared/external/swiftdata/references/swiftdata-queries.md +300 -508
  233. package/pipeline/skills/shared/external/swiftlint/SKILL.md +175 -226
  234. package/pipeline/skills/shared/external/swiftlint/references/adoption-and-configuration.md +141 -208
  235. package/pipeline/skills/shared/external/swiftlint/references/custom-rules-and-analyze.md +100 -109
  236. package/pipeline/skills/shared/external/swiftlint/references/plugins-run-scripts-and-integrations.md +159 -179
  237. package/pipeline/skills/shared/external/swiftlint/references/rule-reference.md +383 -18
  238. package/pipeline/skills/shared/external/swiftlint/references/rules-suppressions-and-baselines.md +143 -229
  239. package/pipeline/skills/shared/external/swiftui-animation/SKILL.md +283 -366
  240. package/pipeline/skills/shared/external/swiftui-animation/references/animation-advanced.md +396 -608
  241. package/pipeline/skills/shared/external/swiftui-animation/references/core-animation-bridge.md +336 -385
  242. package/pipeline/skills/shared/external/swiftui-gestures/SKILL.md +239 -349
  243. package/pipeline/skills/shared/external/swiftui-gestures/references/gesture-patterns.md +228 -310
  244. package/pipeline/skills/shared/external/swiftui-layout-components/SKILL.md +260 -249
  245. package/pipeline/skills/shared/external/swiftui-layout-components/references/form.md +92 -74
  246. package/pipeline/skills/shared/external/swiftui-layout-components/references/grids.md +112 -177
  247. package/pipeline/skills/shared/external/swiftui-layout-components/references/list.md +61 -64
  248. package/pipeline/skills/shared/external/swiftui-layout-components/references/scrollview.md +94 -134
  249. package/pipeline/skills/shared/external/swiftui-liquid-glass/SKILL.md +193 -225
  250. package/pipeline/skills/shared/external/swiftui-liquid-glass/references/liquid-glass.md +173 -327
  251. package/pipeline/skills/shared/external/swiftui-navigation/SKILL.md +201 -168
  252. package/pipeline/skills/shared/external/swiftui-navigation/references/deeplinks.md +127 -150
  253. package/pipeline/skills/shared/external/swiftui-navigation/references/navigationstack.md +134 -133
  254. package/pipeline/skills/shared/external/swiftui-navigation/references/sheets.md +152 -117
  255. package/pipeline/skills/shared/external/swiftui-navigation/references/tabview.md +111 -138
  256. package/pipeline/skills/shared/external/swiftui-patterns/SKILL.md +316 -252
  257. package/pipeline/skills/shared/external/swiftui-patterns/references/architecture-patterns.md +341 -332
  258. package/pipeline/skills/shared/external/swiftui-patterns/references/deprecated-migration.md +547 -854
  259. package/pipeline/skills/shared/external/swiftui-patterns/references/design-polish.md +485 -537
  260. package/pipeline/skills/shared/external/swiftui-patterns/references/platform-and-sharing.md +417 -499
  261. package/pipeline/skills/shared/external/swiftui-performance/SKILL.md +213 -376
  262. package/pipeline/skills/shared/external/swiftui-performance/references/demystify-swiftui-performance-wwdc23.md +86 -175
  263. package/pipeline/skills/shared/external/swiftui-performance/references/optimizing-swiftui-performance-instruments.md +89 -195
  264. package/pipeline/skills/shared/external/swiftui-performance/references/understanding-hangs-in-your-app.md +95 -182
  265. package/pipeline/skills/shared/external/swiftui-performance/references/understanding-improving-swiftui-performance.md +71 -149
  266. package/pipeline/skills/shared/external/swiftui-performance/references/wwdc-session-sources.md +21 -27
  267. package/pipeline/skills/shared/external/swiftui-uikit-interop/SKILL.md +303 -295
  268. package/pipeline/skills/shared/external/swiftui-uikit-interop/references/hosting-migration.md +204 -387
  269. package/pipeline/skills/shared/external/swiftui-uikit-interop/references/representable-recipes.md +469 -683
  270. package/pipeline/skills/shared/external/swiftui-webkit/SKILL.md +140 -186
  271. package/pipeline/skills/shared/external/swiftui-webkit/references/loading-and-observation.md +75 -86
  272. package/pipeline/skills/shared/external/swiftui-webkit/references/local-content-and-custom-schemes.md +63 -60
  273. package/pipeline/skills/shared/external/swiftui-webkit/references/migration-and-fallbacks.md +69 -137
  274. package/pipeline/skills/shared/external/swiftui-webkit/references/navigation-and-javascript.md +95 -67
  275. package/pipeline/skills/shared/external/tipkit/SKILL.md +220 -335
  276. package/pipeline/skills/shared/external/tipkit/references/tipkit-patterns.md +356 -494
  277. package/pipeline/skills/shared/external/vision-framework/SKILL.md +260 -375
  278. package/pipeline/skills/shared/external/vision-framework/references/vision-requests.md +393 -515
  279. package/pipeline/skills/shared/external/vision-framework/references/visionkit-scanner.md +363 -539
  280. package/pipeline/skills/shared/external/weatherkit/SKILL.md +160 -315
  281. package/pipeline/skills/shared/external/weatherkit/references/weatherkit-patterns.md +288 -407
  282. package/pipeline/skills/shared/external/widgetkit/SKILL.md +224 -288
  283. package/pipeline/skills/shared/external/widgetkit/references/widgetkit-advanced.md +416 -719
  284. 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.