@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
@@ -3,41 +3,44 @@
3
3
  "evals": [
4
4
  {
5
5
  "id": 0,
6
- "prompt": "Review this Swift 6.3/Xcode 26 concurrency build-settings plan: the team says Approachable Concurrency alone makes the whole module MainActor, strict concurrency should start at Targeted in Swift 6 mode, and CPU-heavy image decoding can stay on MainActor because nonisolated async functions now hop to a background executor. Correct the plan and give the smallest build-setting and code-level recommendations.",
7
- "expected_output": "A source-grounded settings review that separates Approachable Concurrency from Default Actor Isolation, states that Swift 6 mode uses complete strict concurrency with errors, and recommends @concurrent/nonisolated offloading for CPU-heavy work instead of blocking MainActor.",
6
+ "name": "settings-plan-review",
7
+ "prompt": "Check this plan for our podcast app on Swift 6.3 and Xcode 26: (1) turning on Approachable Concurrency is enough to make the whole app target main-actor isolated; (2) we will begin the Swift 6 migration at the Targeted strict-concurrency level; (3) waveform rendering is CPU heavy but can stay on the main actor, because nonisolated async functions hop to a background thread anyway. Correct what is wrong and say what we should do instead.",
8
+ "expected_output": "Separates the two settings: Approachable Concurrency enables upcoming features, whereas inferring @MainActor everywhere needs the Default Actor Isolation build setting set to MainActor. Notes that the Swift 6 language mode (6.3 included) is complete checking with errors and that Targeted and Minimal are Swift 5 staging levels. Explains that with NonisolatedNonsendingByDefault a nonisolated async function keeps executing on whichever actor called it, so the rendering must be moved with @concurrent on a nonisolated function. Stays at the level of settings and code-level fixes.",
8
9
  "files": [],
9
- "assertions": [
10
- "Separates Xcode's Approachable Concurrency setting from Default Actor Isolation and says MainActor-by-default requires Default Actor Isolation = MainActor.",
11
- "States that Swift 6 / 6.3 language mode uses complete strict concurrency and emits errors, while Targeted or Minimal are Swift 5 migration settings.",
12
- "Explains that nonisolated async functions stay on the caller's actor with nonisolated(nonsending) behavior unless @concurrent is used.",
13
- "Recommends offloading CPU-heavy work with @concurrent and a nonisolated context rather than leaving it on MainActor.",
14
- "Avoids broad architecture or SwiftUI state-management redesign beyond the concurrency settings and code-level fix."
10
+ "expectations": [
11
+ "Treats Approachable Concurrency and Default Actor Isolation as two separate settings, and only the latter, set to MainActor, gives main-actor-by-default",
12
+ "States that in Swift 6 (and 6.3) mode checking is always complete and reports errors, while the Targeted and Minimal levels belong to Swift 5 staging",
13
+ "Says a nonisolated async function inherits the calling actor, the nonisolated(nonsending) behavior, until @concurrent is added",
14
+ "Moves the CPU-heavy rendering off the main actor with @concurrent in a nonisolated context",
15
+ "Limits the answer to build settings and code-level changes, with no broader redesign of architecture or SwiftUI state"
15
16
  ]
16
17
  },
17
18
  {
18
19
  "id": 1,
19
- "prompt": "A SwiftUI app with Default Actor Isolation set to MainActor has errors around a @Observable StickerModel conforming to Exportable, a PhotoProcessor async method, and a legacy SDK imported with @preconcurrency. Give a diagnostic remediation plan that preserves behavior, avoids unchecked Sendable unless truly justified, and explains which fixes belong in swift-concurrency rather than architecture or navigation skills.",
20
- "expected_output": "A diagnostic remediation plan that uses @MainActor or isolated conformances for UI-bound state, explains nonisolated(nonsending) and @concurrent tradeoffs for PhotoProcessor work, treats @preconcurrency as temporary, and keeps architecture/navigation details as sibling handoffs.",
20
+ "name": "default-isolation-remediation",
21
+ "prompt": "Our app target uses Default Actor Isolation = MainActor. We get errors on an @Observable PlaylistModel that conforms to our Archivable protocol, on an async render method of a plain WaveformRenderer class, and around a vendor analytics SDK we import with @preconcurrency. Give a remediation plan that keeps behavior the same, and tell us what is out of scope for this pass.",
22
+ "expected_output": "Keeps PlaylistModel on the main actor and meets the protocol through a main-actor isolated conformance, written extension PlaylistModel: @MainActor Archivable. Explains that WaveformRenderer.render executes on its caller's actor under nonisolated(nonsending), so only CPU-heavy parts should move to a @concurrent nonisolated function. Prefers immutable values, actor isolation or locks over @unchecked Sendable. Treats the @preconcurrency import as temporary with a written removal plan, and leaves module layout, navigation and who owns which SwiftUI state to sibling skills.",
21
23
  "files": [],
22
- "assertions": [
23
- "Uses @MainActor isolation or an isolated conformance such as extension StickerModel: @MainActor Exportable for UI-bound protocol conformance errors.",
24
- "Explains when PhotoProcessor can stay on the caller's actor and when CPU-heavy work should move to @concurrent/nonisolated async code.",
25
- "Prefers value immutability, actor isolation, or synchronization over adding @unchecked Sendable by default.",
26
- "Treats @preconcurrency import as a temporary bridge for third-party modules with a documented removal plan.",
27
- "Routes module architecture, navigation implementation, and detailed SwiftUI state ownership to sibling skills instead of expanding this skill's scope."
24
+ "expectations": [
25
+ "Fixes the conformance with @MainActor on the type or the isolated form extension PlaylistModel: @MainActor Archivable",
26
+ "Separates the case where WaveformRenderer may keep running on the calling actor from CPU-bound work that belongs in a @concurrent nonisolated function",
27
+ "Reaches for immutable values, an actor or a lock before any @unchecked Sendable",
28
+ "Keeps the @preconcurrency import only temporarily and asks for a written plan to drop it",
29
+ "Hands module layout, navigation and fine-grained SwiftUI state ownership over to sibling skills"
28
30
  ]
29
31
  },
30
32
  {
31
33
  "id": 2,
32
- "prompt": "Review this synchronization plan for a Swift 6.3 app: use an actor for a synchronous metrics counter called from C callbacks, put NSLock inside an actor for cache mutation, hold a Mutex while awaiting a network fetch, and ban NSLock because it is not Sendable. Replace it with a modern concurrency-safe plan for iOS 16 through iOS 26.",
33
- "expected_output": "A synchronization review that chooses actors for async shared state, Mutex or OSAllocatedUnfairLock for synchronous state depending on deployment target, Atomic for simple counters or flags, avoids locks inside actors or across await, and corrects the NSLock Sendable claim without recommending it first.",
34
+ "name": "locks-versus-actors",
35
+ "prompt": "Review this plan; the app's deployment range is iOS 16 up to iOS 26: an actor holds the frame-drop counter that a C audio callback increments synchronously; another actor guards its dictionary with an NSLock as extra protection; a Mutex stays locked while we await the network refresh; and NSLock is banned because it is not Sendable. What should change?",
36
+ "expected_output": "Keeps actors for shared mutable state reached asynchronously where hops are acceptable, and replaces the counter with Atomic on iOS 18 or a lock for iOS 16-17 because the C callback is synchronous. Picks Mutex where iOS 18 is the floor and OSAllocatedUnfairLock for the iOS 16 and 17 range or when lock ownership should be asserted. Removes the NSLock from inside the actor and never holds a lock across await. Points out that NSLock does conform to Sendable, yet still favors the newer primitives that own their state.",
34
37
  "files": [],
35
- "assertions": [
36
- "Uses an actor for shared mutable state when asynchronous access and actor hops are acceptable.",
37
- "Uses Mutex for new code targeting iOS 18+ and OSAllocatedUnfairLock for iOS 16-17 support or ownership-assertion needs.",
38
- "Uses Atomic for simple scalar counters or flags rather than an actor or full lock when appropriate.",
39
- "Rejects locks inside actors and rejects holding any lock across await suspension points.",
40
- "Corrects the claim that NSLock is not Sendable while still preferring modern state-protecting primitives for new Swift concurrency code."
38
+ "expectations": [
39
+ "Keeps an actor where every caller can await and the hop cost does not matter",
40
+ "Chooses Mutex when iOS 18 is the minimum, OSAllocatedUnfairLock for iOS 16 and 17 or for ownership preconditions",
41
+ "Uses Atomic for a simple scalar counter or flag instead of an actor or a full lock",
42
+ "Rejects locks inside actors and any lock held across await",
43
+ "Fixes the false statement that NSLock lacks Sendable, but still prefers the newer lock types that hold their state"
41
44
  ]
42
45
  }
43
46
  ]
@@ -1,87 +1,72 @@
1
1
  # Approachable Concurrency Quick Reference
2
2
 
3
- Use this reference when the project has opted into the Swift 6.2 approachable
4
- concurrency settings and, when appropriate, default MainActor isolation.
5
-
6
- ## Detecting the Mode
7
-
8
- **Xcode 26:** Check build settings under Swift Compiler > Concurrency:
9
- - Swift language version: 6.2+
10
- - Approachable Concurrency: enabled when using the bundled upcoming-feature flags
11
- (`NonisolatedNonsendingByDefault`, isolated-conformance inference, inferred
12
- Sendable captures, and related usability flags).
13
- - Default Actor Isolation: `MainActor` when unannotated code should infer
14
- `@MainActor` isolation.
15
- - Strict Concurrency Checking: Swift 6 language mode is complete and emits
16
- errors; Complete / Targeted / Minimal are migration settings for earlier
17
- language modes.
18
-
19
- **SwiftPM:** Inspect `Package.swift` `swiftSettings` for the corresponding flags.
20
-
21
- ## Behavior Changes
22
-
23
- ### Async functions stay on the caller's actor
24
-
25
- In Swift 6.2, nonisolated async functions no longer hop to the global
26
- concurrent executor. They stay on whichever actor called them. This eliminates
27
- many "sending X risks causing data races" errors.
28
-
29
- ### Default MainActor isolation
30
-
31
- With Default Actor Isolation set to `MainActor`, unannotated declarations in the
32
- module are inferred as `@MainActor`.
33
- This means:
34
- - Global and static variables are protected by default.
35
- - Protocol conformances are implicitly isolated.
36
- - Mutable state is safe without explicit annotation.
37
-
38
- ### Isolated conformances
39
-
40
- Protocol conformances can be explicitly isolated:
41
- `extension Foo: @MainActor SomeProtocol`. The compiler prevents using the
42
- conformance outside the matching isolation context.
43
-
44
- ## Applying Fixes in This Mode
45
-
46
- - **Prefer minimal annotations.** Let default MainActor isolation do the work
47
- for UI-bound code.
48
- - **Use isolated conformances** instead of `nonisolated` workarounds for
49
- protocol conformances.
50
- - **Keep global/shared mutable state on MainActor** unless there is a clear
51
- performance need to offload.
52
- - **Remove redundant `@MainActor` annotations** that are now implied by the
53
- default isolation mode.
54
-
55
- ## Offloading Work
56
-
57
- - Use `@concurrent` on async functions that must run on the concurrent pool.
58
- - Make types or members `nonisolated` only when they are truly thread-safe and
59
- used off the main actor.
60
- - Continue to respect `Sendable` boundaries when values cross actors or tasks.
61
-
62
- ## Common Pitfalls
63
-
64
- | Pitfall | Why it happens | Fix |
3
+ ## Which mode is this target in?
4
+
5
+ - **Xcode 26:** open Build Settings and read the Swift Compiler - Concurrency
6
+ group.
7
+ - **Language version:** approachable concurrency needs Swift 6.2 or later.
8
+ - **Approachable Concurrency = Yes:** the upcoming features
9
+ `NonisolatedNonsendingByDefault`, isolated-conformance inference, inferred
10
+ `Sendable` for captures and related global-actor usability changes are on.
11
+ - **Default Actor Isolation = MainActor:** declarations without an isolation
12
+ annotation are inferred `@MainActor`.
13
+ - **Strict Concurrency Checking:** Swift 6 language mode is always complete and
14
+ reports errors. Complete, Targeted and Minimal are choices for Swift 5 mode.
15
+ - **SwiftPM:** the same switches appear as entries in each target's
16
+ `swiftSettings` in `Package.swift`.
17
+
18
+ ## What changes
19
+
20
+ - A `nonisolated` async function keeps running on the actor that called it
21
+ instead of moving to the global concurrent executor, as long as
22
+ `NonisolatedNonsendingByDefault` is on. Many "sending 'x' risks causing data
23
+ races" errors go away as a result.
24
+ - With default MainActor isolation, globals and statics are protected,
25
+ conformances are isolated to the main actor, and ordinary mutable state is
26
+ safe without annotation.
27
+ - A conformance can also be isolated by hand:
28
+ `extension Timeline: @MainActor Refreshable`. The compiler rejects any use
29
+ of it outside main-actor code.
30
+
31
+ ## Fixing code in this mode
32
+
33
+ - Add as few annotations as possible; let the default isolate UI code.
34
+ - For protocol conformances, reach for an isolated conformance before a
35
+ `nonisolated` workaround.
36
+ - Keep shared mutable state on the main actor unless profiling gives a reason
37
+ to move it.
38
+ - Delete `@MainActor` attributes the default already implies.
39
+
40
+ ### Moving work off the main actor
41
+
42
+ - Put `@concurrent` on async functions that must run on the thread pool.
43
+ - Mark a type or member `nonisolated` only if it really is safe to use from
44
+ several threads and actually runs off the main actor.
45
+ - Values crossing between actors or tasks still have to be `Sendable`.
46
+
47
+ ## Pitfalls
48
+
49
+ | Symptom | Cause | Fix |
65
50
  |---|---|---|
66
- | CPU-heavy work on MainActor | Default isolation hides the problem | Move to `@concurrent` async function |
67
- | `Task.detached` breaking isolation | Ignores inherited actor context | Use `Task { }` unless you truly need detachment |
68
- | Redundant `@MainActor` everywhere | Default isolation already provides it | Remove explicit annotations |
69
- | `nonisolated` on mutable state | Breaks the safety guarantee | Keep mutable state isolated |
51
+ | UI stutters after enabling the mode | CPU-heavy work now inferred onto the main actor | Move it into a `@concurrent` async function |
52
+ | Isolation errors inside a new task | `Task.detached` drops the inherited actor | Use `Task { }` unless detachment is the point |
53
+ | `@MainActor` on nearly every declaration | Annotations from before the default was on | Remove the redundant ones |
54
+ | Races reappear | `nonisolated` placed on mutable state | Keep mutable state isolated |
70
55
 
71
- ## Concurrency Keywords
56
+ ## Keywords
72
57
 
73
- | Keyword | What it does |
58
+ | Keyword | Meaning |
74
59
  |---|---|
75
- | `async` | Function can suspend |
76
- | `await` | Suspend here until done |
77
- | `Task { }` | Start async work, inherits context |
78
- | `Task.detached { }` | Start async work, no inherited context |
79
- | `Task.immediate { }` | Start immediately on current actor |
80
- | `@MainActor` | Runs on main thread |
81
- | `actor` | Type with isolated mutable state |
82
- | `nonisolated` | Opts out of actor isolation |
60
+ | `async` | The function may suspend |
61
+ | `await` | A point where the caller may suspend until the call finishes |
62
+ | `Task { }` | New unstructured work that inherits actor, priority and task-locals |
63
+ | `Task.detached { }` | New unstructured work that inherits none of them |
64
+ | `Task.immediate { }` | New work that starts running at once on the current actor |
65
+ | `@MainActor` | Isolated to the main actor, which runs on the main thread |
66
+ | `actor` | Reference type whose mutable state is isolated to itself |
67
+ | `nonisolated` | Not isolated to any actor |
83
68
  | `Sendable` | Safe to pass between isolation domains |
84
- | `@concurrent` | Always run on background thread pool (Swift 6.2+) |
85
- | `async let` | Start parallel work (fixed count) |
86
- | `TaskGroup` | Dynamic parallel work |
87
- | `sending` | Parameter-level isolation transfer (SE-0430) |
69
+ | `@concurrent` | Always runs on the concurrent thread pool (Swift 6.2) |
70
+ | `async let` | Concurrent child work, fixed count |
71
+ | `TaskGroup` | Concurrent child work, count decided at run time |
72
+ | `sending` | Parameter or result that transfers a value to another isolation (SE-0430) |
@@ -1,113 +1,77 @@
1
1
  # Swift Async Algorithms
2
2
 
3
- [swift-async-algorithms](https://github.com/apple/swift-async-algorithms) is an Apple open-source package providing `AsyncSequence` algorithms modeled after the standard library's `Sequence` algorithms.
4
-
5
- ## Contents
6
-
7
- - [Key Algorithms](#key-algorithms)
8
- - [Common Patterns](#common-patterns)
9
-
10
- Add to Package.swift:
11
-
12
- ```swift
13
- .package(url: "https://github.com/apple/swift-async-algorithms", from: "1.0.0")
14
- ```
15
-
16
- ## Key Algorithms
17
-
18
- ### Combining
3
+ `swift-async-algorithms` is an open-source Apple package that brings the
4
+ familiar `Sequence` algorithms, plus time-based ones, to `AsyncSequence`.
19
5
 
20
6
  ```swift
21
- import AsyncAlgorithms
22
-
23
- // Merge multiple sequences into one (interleaved by arrival time)
24
- for await value in merge(streamA, streamB) {
25
- handle(value)
26
- }
27
-
28
- // Combine latest values from two sequences (emits when either updates)
29
- for await (a, b) in combineLatest(streamA, streamB) {
30
- handle(a, b)
31
- }
32
-
33
- // Zip - pairs elements 1:1 (waits for both)
34
- for await (a, b) in zip(streamA, streamB) {
35
- handle(a, b)
36
- }
37
-
38
- // Chain - concatenate sequences end-to-end
39
- for await value in chain(streamA, streamB) {
40
- handle(value)
41
- }
7
+ // Package.swift
8
+ dependencies: [
9
+ .package(
10
+ url: "https://github.com/apple/swift-async-algorithms",
11
+ .upToNextMajor(from: "1.0.0")
12
+ )
13
+ ],
14
+ targets: [
15
+ .target(
16
+ name: "Feed",
17
+ dependencies: [.product(name: "AsyncAlgorithms", package: "swift-async-algorithms")]
18
+ )
19
+ ]
42
20
  ```
43
21
 
44
- ### Temporal
22
+ Then `import AsyncAlgorithms` in the source files that use it.
45
23
 
46
- ```swift
47
- // Debounce - emit after a quiet period (e.g., search-as-you-type)
48
- let searchResults = searchTerms
49
- .debounce(for: .milliseconds(300))
24
+ ## Combining sequences
50
25
 
51
- for await term in searchResults {
52
- await performSearch(term)
53
- }
54
-
55
- // Throttle - emit at most once per interval
56
- let throttled = sensorReadings
57
- .throttle(for: .seconds(1))
58
-
59
- for await reading in throttled {
60
- updateDisplay(reading)
61
- }
26
+ | Function | Result |
27
+ |---|---|
28
+ | `merge(first, second)` | One sequence with elements from both, in the order they arrive |
29
+ | `combineLatest(first, second)` | The most recent pair, emitted whenever either side produces |
30
+ | `zip(first, second)` | Elements paired one to one; waits until both sides have one |
31
+ | `chain(first, second)` | All of `first`, then all of `second` |
62
32
 
63
- // Chunks - collect elements into arrays by count or time
64
- for await batch in events.chunks(ofCount: 10) {
65
- await processBatch(batch) // [Event] with up to 10 elements
66
- }
33
+ ## Time-based operators
67
34
 
68
- for await batch in events.chunked(by: .repeating(every: .seconds(1))) {
69
- await processBatch(batch)
70
- }
71
- ```
35
+ | Operator | Behavior | Typical use |
36
+ |---|---|---|
37
+ | `.debounce(for: .milliseconds(250))` | Emits only after the input goes quiet for the interval | Search fields |
38
+ | `.chunks(ofCount: 20)` | Arrays of up to 20 elements | Batch writes |
39
+ | `.chunked(by: .repeating(every: .seconds(5)))` | Arrays collected per time window | Periodic flushes |
40
+ | `.chunks(ofCount: 25, or: .repeating(every: .seconds(2)))` | A batch when it is full or when the timer fires, whichever comes first | Batch uploads with a latency cap |
72
41
 
73
- ### Filtering and Transformation
42
+ Throttling ships in the 1.x releases only as the underscored `_throttle(for:)`,
43
+ which is not stable public API; do not build on it.
74
44
 
75
- ```swift
76
- // Remove consecutive duplicates
77
- for await value in stream.removeDuplicates() {
78
- handle(value)
79
- }
45
+ ## Filtering and cleanup
80
46
 
81
- // Compacted - remove nils (like compactMap without transform)
82
- let values: AsyncStream<Int?> = ...
83
- for await value in values.compacted() {
84
- // value is non-optional Int
85
- }
86
- ```
47
+ - `.removeDuplicates()` drops an element equal to the one just before it.
48
+ - `.compacted()` removes `nil` from a sequence of optionals, the same as
49
+ `compactMap { $0 }`.
87
50
 
88
- ## Common Patterns
51
+ ## Patterns
89
52
 
90
- ### Search-as-you-type
53
+ ### Search as the user types
91
54
 
92
55
  ```swift
93
- func searchResults(for terms: AsyncStream<String>) -> AsyncStream<[Result]> {
56
+ func suggestions(for queries: AsyncStream<String>) -> AsyncStream<[Place]> {
94
57
  AsyncStream { continuation in
95
- Task {
96
- for await term in terms.debounce(for: .milliseconds(300)) {
97
- guard !Task.isCancelled else { break }
98
- let results = try? await searchService.search(term)
99
- continuation.yield(results ?? [])
58
+ let worker = Task {
59
+ for await query in queries.debounce(for: .milliseconds(250)).removeDuplicates() {
60
+ if Task.isCancelled { break }
61
+ let places = (try? await geocoder.search(query)) ?? []
62
+ continuation.yield(places)
100
63
  }
101
64
  continuation.finish()
102
65
  }
66
+ continuation.onTermination = { _ in worker.cancel() }
103
67
  }
104
68
  }
105
69
  ```
106
70
 
107
- ### Rate-limited API calls
71
+ ### Batched uploads
108
72
 
109
73
  ```swift
110
- for await batch in requestStream.chunks(ofCount: 50).throttle(for: .seconds(1)) {
111
- await api.sendBatch(batch)
74
+ for await batch in pendingEvents.chunks(ofCount: 25, or: .repeating(every: .seconds(2))) {
75
+ try await analytics.upload(batch)
112
76
  }
113
77
  ```