@mmerterden/multi-agent-pipeline 20.7.0 → 20.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (264) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/LICENSE +0 -10
  3. package/docs/facts.json +1 -1
  4. package/manifest.json +266 -267
  5. package/package.json +2 -2
  6. package/pipeline/scripts/_notices.mjs +1 -1
  7. package/pipeline/skills/.skill-manifest.json +68 -68
  8. package/pipeline/skills/shared/README.md +70 -70
  9. package/pipeline/skills/shared/external/alarmkit/SKILL.md +373 -381
  10. package/pipeline/skills/shared/external/alarmkit/evals/evals.json +23 -18
  11. package/pipeline/skills/shared/external/alarmkit/references/alarmkit-patterns.md +328 -378
  12. package/pipeline/skills/shared/external/app-clips/SKILL.md +260 -160
  13. package/pipeline/skills/shared/external/app-clips/evals/evals.json +27 -27
  14. package/pipeline/skills/shared/external/app-clips/references/data-handoff-notifications-location.md +150 -83
  15. package/pipeline/skills/shared/external/app-clips/references/routing-and-experiences.md +135 -83
  16. package/pipeline/skills/shared/external/app-clips/references/size-capabilities-and-promotion.md +143 -85
  17. package/pipeline/skills/shared/external/app-intents/SKILL.md +302 -304
  18. package/pipeline/skills/shared/external/app-intents/evals/evals.json +21 -21
  19. package/pipeline/skills/shared/external/app-intents/references/appintents-advanced.md +594 -894
  20. package/pipeline/skills/shared/external/app-store-optimization/SKILL.md +339 -277
  21. package/pipeline/skills/shared/external/app-store-optimization/evals/evals.json +27 -23
  22. package/pipeline/skills/shared/external/app-store-optimization/references/keyword-research-methodology.md +105 -122
  23. package/pipeline/skills/shared/external/app-store-optimization/references/product-page-variants.md +143 -166
  24. package/pipeline/skills/shared/external/app-store-review/SKILL.md +307 -326
  25. package/pipeline/skills/shared/external/app-store-review/evals/evals.json +21 -21
  26. package/pipeline/skills/shared/external/app-store-review/references/privacy-manifest.md +105 -67
  27. package/pipeline/skills/shared/external/app-store-review/references/review-checklists.md +114 -101
  28. package/pipeline/skills/shared/external/apple-on-device-ai/SKILL.md +333 -360
  29. package/pipeline/skills/shared/external/apple-on-device-ai/evals/evals.json +24 -27
  30. package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-conversion.md +215 -322
  31. package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-optimization.md +161 -256
  32. package/pipeline/skills/shared/external/apple-on-device-ai/references/foundation-models.md +277 -387
  33. package/pipeline/skills/shared/external/apple-on-device-ai/references/mlx-swift.md +196 -210
  34. package/pipeline/skills/shared/external/authentication/SKILL.md +265 -381
  35. package/pipeline/skills/shared/external/authentication/evals/evals.json +25 -25
  36. package/pipeline/skills/shared/external/authentication/references/keychain-biometric.md +133 -178
  37. package/pipeline/skills/shared/external/authentication/references/passkeys.md +111 -147
  38. package/pipeline/skills/shared/external/avkit/SKILL.md +267 -364
  39. package/pipeline/skills/shared/external/avkit/evals/evals.json +26 -26
  40. package/pipeline/skills/shared/external/avkit/references/avkit-patterns.md +375 -493
  41. package/pipeline/skills/shared/external/background-processing/SKILL.md +270 -382
  42. package/pipeline/skills/shared/external/background-processing/evals/evals.json +22 -22
  43. package/pipeline/skills/shared/external/background-processing/references/background-task-patterns.md +169 -317
  44. package/pipeline/skills/shared/external/callkit-voip/SKILL.md +290 -371
  45. package/pipeline/skills/shared/external/callkit-voip/evals/evals.json +24 -24
  46. package/pipeline/skills/shared/external/callkit-voip/references/callkit-patterns.md +175 -343
  47. package/pipeline/skills/shared/external/cloudkit-sync/SKILL.md +292 -381
  48. package/pipeline/skills/shared/external/cloudkit-sync/evals/evals.json +33 -30
  49. package/pipeline/skills/shared/external/cloudkit-sync/references/cloudkit-patterns.md +227 -355
  50. package/pipeline/skills/shared/external/contacts-framework/SKILL.md +197 -346
  51. package/pipeline/skills/shared/external/contacts-framework/evals/evals.json +19 -21
  52. package/pipeline/skills/shared/external/contacts-framework/references/contacts-patterns.md +169 -308
  53. package/pipeline/skills/shared/external/core-bluetooth/SKILL.md +226 -376
  54. package/pipeline/skills/shared/external/core-bluetooth/evals/evals.json +25 -22
  55. package/pipeline/skills/shared/external/core-bluetooth/references/ble-patterns.md +257 -337
  56. package/pipeline/skills/shared/external/core-data/SKILL.md +292 -368
  57. package/pipeline/skills/shared/external/core-data/evals/evals.json +30 -27
  58. package/pipeline/skills/shared/external/core-motion/SKILL.md +235 -324
  59. package/pipeline/skills/shared/external/core-motion/evals/evals.json +31 -27
  60. package/pipeline/skills/shared/external/core-motion/references/motion-patterns.md +210 -310
  61. package/pipeline/skills/shared/external/core-nfc/SKILL.md +292 -366
  62. package/pipeline/skills/shared/external/core-nfc/evals/evals.json +22 -24
  63. package/pipeline/skills/shared/external/core-nfc/references/nfc-patterns.md +233 -329
  64. package/pipeline/skills/shared/external/coreml/SKILL.md +323 -367
  65. package/pipeline/skills/shared/external/coreml/evals/evals.json +24 -21
  66. package/pipeline/skills/shared/external/coreml/references/coreml-swift-integration.md +562 -565
  67. package/pipeline/skills/shared/external/cryptokit/SKILL.md +253 -394
  68. package/pipeline/skills/shared/external/cryptokit/evals/evals.json +20 -18
  69. package/pipeline/skills/shared/external/cryptokit/references/cryptokit-patterns.md +299 -488
  70. package/pipeline/skills/shared/external/debugging-instruments/SKILL.md +270 -323
  71. package/pipeline/skills/shared/external/debugging-instruments/evals/evals.json +27 -30
  72. package/pipeline/skills/shared/external/debugging-instruments/references/instruments-guide.md +167 -315
  73. package/pipeline/skills/shared/external/debugging-instruments/references/lldb-patterns.md +140 -193
  74. package/pipeline/skills/shared/external/device-integrity/SKILL.md +230 -353
  75. package/pipeline/skills/shared/external/device-integrity/evals/evals.json +25 -21
  76. package/pipeline/skills/shared/external/device-integrity/references/device-integrity-patterns.md +159 -197
  77. package/pipeline/skills/shared/external/energykit/SKILL.md +225 -392
  78. package/pipeline/skills/shared/external/energykit/evals/evals.json +29 -28
  79. package/pipeline/skills/shared/external/energykit/references/energykit-patterns.md +174 -470
  80. package/pipeline/skills/shared/external/eventkit-calendar/SKILL.md +261 -383
  81. package/pipeline/skills/shared/external/eventkit-calendar/evals/evals.json +25 -22
  82. package/pipeline/skills/shared/external/eventkit-calendar/references/eventkit-patterns.md +165 -268
  83. package/pipeline/skills/shared/external/healthkit/SKILL.md +252 -303
  84. package/pipeline/skills/shared/external/healthkit/evals/evals.json +24 -23
  85. package/pipeline/skills/shared/external/healthkit/references/healthkit-patterns.md +369 -523
  86. package/pipeline/skills/shared/external/homekit-matter/SKILL.md +233 -348
  87. package/pipeline/skills/shared/external/homekit-matter/evals/evals.json +27 -22
  88. package/pipeline/skills/shared/external/homekit-matter/references/matter-commissioning.md +199 -305
  89. package/pipeline/skills/shared/external/ios-accessibility/SKILL.md +368 -340
  90. package/pipeline/skills/shared/external/ios-accessibility/evals/evals.json +28 -27
  91. package/pipeline/skills/shared/external/ios-accessibility/references/a11y-patterns.md +314 -260
  92. package/pipeline/skills/shared/external/ios-accessibility/references/media-accessibility.md +97 -67
  93. package/pipeline/skills/shared/external/ios-accessibility/references/nutrition-labels.md +165 -101
  94. package/pipeline/skills/shared/external/ios-localization/SKILL.md +258 -371
  95. package/pipeline/skills/shared/external/ios-localization/evals/evals.json +23 -23
  96. package/pipeline/skills/shared/external/ios-localization/references/formatstyle-locale.md +283 -491
  97. package/pipeline/skills/shared/external/ios-localization/references/string-catalogs.md +313 -440
  98. package/pipeline/skills/shared/external/ios-networking/SKILL.md +265 -341
  99. package/pipeline/skills/shared/external/ios-networking/evals/evals.json +24 -24
  100. package/pipeline/skills/shared/external/ios-networking/references/background-websocket.md +425 -652
  101. package/pipeline/skills/shared/external/ios-networking/references/file-storage-patterns.md +143 -285
  102. package/pipeline/skills/shared/external/ios-networking/references/lightweight-clients.md +93 -53
  103. package/pipeline/skills/shared/external/ios-networking/references/network-framework.md +231 -456
  104. package/pipeline/skills/shared/external/ios-networking/references/urlsession-patterns.md +517 -784
  105. package/pipeline/skills/shared/external/ios-simulator/SKILL.md +265 -393
  106. package/pipeline/skills/shared/external/ios-simulator/evals/evals.json +21 -21
  107. package/pipeline/skills/shared/external/ios-simulator/references/simctl-commands.md +177 -270
  108. package/pipeline/skills/shared/external/live-activities/SKILL.md +318 -360
  109. package/pipeline/skills/shared/external/live-activities/evals/evals.json +21 -21
  110. package/pipeline/skills/shared/external/live-activities/references/activitykit-patterns.md +478 -710
  111. package/pipeline/skills/shared/external/mapkit-location/SKILL.md +295 -267
  112. package/pipeline/skills/shared/external/mapkit-location/evals/evals.json +28 -24
  113. package/pipeline/skills/shared/external/mapkit-location/references/mapkit-corelocation-patterns.md +378 -532
  114. package/pipeline/skills/shared/external/mapkit-location/references/mapkit-patterns.md +397 -499
  115. package/pipeline/skills/shared/external/metrickit-diagnostics/SKILL.md +165 -348
  116. package/pipeline/skills/shared/external/metrickit-diagnostics/evals/evals.json +26 -23
  117. package/pipeline/skills/shared/external/metrickit-diagnostics/references/metrickit-patterns.md +123 -130
  118. package/pipeline/skills/shared/external/musickit-audio/SKILL.md +189 -315
  119. package/pipeline/skills/shared/external/musickit-audio/evals/evals.json +22 -21
  120. package/pipeline/skills/shared/external/musickit-audio/references/musickit-patterns.md +181 -270
  121. package/pipeline/skills/shared/external/natural-language/SKILL.md +188 -340
  122. package/pipeline/skills/shared/external/natural-language/evals/evals.json +21 -21
  123. package/pipeline/skills/shared/external/natural-language/references/translation-patterns.md +171 -225
  124. package/pipeline/skills/shared/external/passkit-wallet/SKILL.md +258 -392
  125. package/pipeline/skills/shared/external/passkit-wallet/evals/evals.json +30 -29
  126. package/pipeline/skills/shared/external/passkit-wallet/references/wallet-passes.md +164 -231
  127. package/pipeline/skills/shared/external/pdfkit/SKILL.md +312 -344
  128. package/pipeline/skills/shared/external/pdfkit/evals/evals.json +19 -19
  129. package/pipeline/skills/shared/external/pdfkit/references/pdfkit-patterns.md +413 -624
  130. package/pipeline/skills/shared/external/pencilkit-drawing/SKILL.md +242 -358
  131. package/pipeline/skills/shared/external/pencilkit-drawing/evals/evals.json +25 -21
  132. package/pipeline/skills/shared/external/pencilkit-drawing/references/pencilkit-patterns.md +161 -226
  133. package/pipeline/skills/shared/external/permissionkit/SKILL.md +282 -400
  134. package/pipeline/skills/shared/external/permissionkit/evals/evals.json +27 -30
  135. package/pipeline/skills/shared/external/permissionkit/references/permissionkit-patterns.md +237 -350
  136. package/pipeline/skills/shared/external/photos-camera-media/SKILL.md +276 -325
  137. package/pipeline/skills/shared/external/photos-camera-media/references/av-playback.md +299 -545
  138. package/pipeline/skills/shared/external/photos-camera-media/references/camera-capture.md +344 -588
  139. package/pipeline/skills/shared/external/photos-camera-media/references/image-loading-caching.md +316 -660
  140. package/pipeline/skills/shared/external/photos-camera-media/references/photokit-patterns.md +270 -416
  141. package/pipeline/skills/shared/external/push-notifications/SKILL.md +312 -340
  142. package/pipeline/skills/shared/external/push-notifications/evals/evals.json +27 -26
  143. package/pipeline/skills/shared/external/push-notifications/references/notification-patterns.md +328 -485
  144. package/pipeline/skills/shared/external/push-notifications/references/rich-notifications.md +327 -560
  145. package/pipeline/skills/shared/external/realitykit-ar/SKILL.md +218 -410
  146. package/pipeline/skills/shared/external/realitykit-ar/evals/evals.json +24 -27
  147. package/pipeline/skills/shared/external/realitykit-ar/references/realitykit-patterns.md +221 -348
  148. package/pipeline/skills/shared/external/shareplay-activities/SKILL.md +222 -393
  149. package/pipeline/skills/shared/external/shareplay-activities/evals/evals.json +23 -24
  150. package/pipeline/skills/shared/external/shareplay-activities/references/shareplay-patterns.md +280 -420
  151. package/pipeline/skills/shared/external/speech-recognition/SKILL.md +217 -421
  152. package/pipeline/skills/shared/external/speech-recognition/evals/evals.json +23 -26
  153. package/pipeline/skills/shared/external/speech-recognition/references/speechanalyzer-patterns.md +133 -125
  154. package/pipeline/skills/shared/external/storekit/SKILL.md +228 -204
  155. package/pipeline/skills/shared/external/storekit/evals/evals.json +27 -24
  156. package/pipeline/skills/shared/external/storekit/references/app-review-guidelines.md +98 -109
  157. package/pipeline/skills/shared/external/storekit/references/core-patterns.md +298 -242
  158. package/pipeline/skills/shared/external/storekit/references/storekit-advanced.md +356 -649
  159. package/pipeline/skills/shared/external/swift-api-design-guidelines/SKILL.md +274 -399
  160. package/pipeline/skills/shared/external/swift-api-design-guidelines/evals/evals.json +22 -24
  161. package/pipeline/skills/shared/external/swift-api-design-guidelines/references/argument-labels-and-parameters.md +107 -108
  162. package/pipeline/skills/shared/external/swift-api-design-guidelines/references/conventions-and-special-rules.md +93 -165
  163. package/pipeline/skills/shared/external/swift-api-design-guidelines/references/naming-and-clarity.md +99 -137
  164. package/pipeline/skills/shared/external/swift-api-design-guidelines/references/side-effects-and-mutating-pairs.md +77 -120
  165. package/pipeline/skills/shared/external/swift-architecture/SKILL.md +334 -350
  166. package/pipeline/skills/shared/external/swift-architecture/evals/evals.json +22 -22
  167. package/pipeline/skills/shared/external/swift-charts/SKILL.md +208 -394
  168. package/pipeline/skills/shared/external/swift-charts/evals/evals.json +27 -30
  169. package/pipeline/skills/shared/external/swift-charts/references/charts-patterns.md +351 -762
  170. package/pipeline/skills/shared/external/swift-codable/SKILL.md +339 -343
  171. package/pipeline/skills/shared/external/swift-codable/evals/evals.json +20 -20
  172. package/pipeline/skills/shared/external/swift-concurrency/SKILL.md +303 -351
  173. package/pipeline/skills/shared/external/swift-concurrency/evals/evals.json +27 -24
  174. package/pipeline/skills/shared/external/swift-concurrency/references/approachable-concurrency.md +65 -80
  175. package/pipeline/skills/shared/external/swift-concurrency/references/async-algorithms.md +48 -84
  176. package/pipeline/skills/shared/external/swift-concurrency/references/bridging-interop.md +134 -79
  177. package/pipeline/skills/shared/external/swift-concurrency/references/concurrency-patterns.md +145 -167
  178. package/pipeline/skills/shared/external/swift-concurrency/references/diagnostics.md +62 -50
  179. package/pipeline/skills/shared/external/swift-concurrency/references/swiftui-concurrency.md +92 -121
  180. package/pipeline/skills/shared/external/swift-concurrency/references/synchronization-primitives.md +177 -241
  181. package/pipeline/skills/shared/external/swift-formatstyle/SKILL.md +258 -234
  182. package/pipeline/skills/shared/external/swift-language/SKILL.md +342 -382
  183. package/pipeline/skills/shared/external/swift-language/evals/evals.json +24 -27
  184. package/pipeline/skills/shared/external/swift-language/references/swift-attributes-interop.md +79 -56
  185. package/pipeline/skills/shared/external/swift-language/references/swift-patterns-extended.md +297 -340
  186. package/pipeline/skills/shared/external/swift-security/SKILL.md +180 -161
  187. package/pipeline/skills/shared/external/swift-security/evals/evals.json +25 -25
  188. package/pipeline/skills/shared/external/swift-security/references/biometric-authentication.md +314 -469
  189. package/pipeline/skills/shared/external/swift-security/references/certificate-trust.md +408 -476
  190. package/pipeline/skills/shared/external/swift-security/references/common-anti-patterns.md +260 -530
  191. package/pipeline/skills/shared/external/swift-security/references/compliance-owasp-mapping.md +270 -477
  192. package/pipeline/skills/shared/external/swift-security/references/credential-storage-patterns.md +573 -571
  193. package/pipeline/skills/shared/external/swift-security/references/cryptokit-public-key.md +370 -441
  194. package/pipeline/skills/shared/external/swift-security/references/cryptokit-symmetric.md +332 -433
  195. package/pipeline/skills/shared/external/swift-security/references/keychain-access-control.md +346 -468
  196. package/pipeline/skills/shared/external/swift-security/references/keychain-fundamentals.md +352 -472
  197. package/pipeline/skills/shared/external/swift-security/references/keychain-item-classes.md +431 -432
  198. package/pipeline/skills/shared/external/swift-security/references/keychain-sharing.md +328 -425
  199. package/pipeline/skills/shared/external/swift-security/references/migration-legacy-stores.md +341 -579
  200. package/pipeline/skills/shared/external/swift-security/references/secure-enclave.md +396 -457
  201. package/pipeline/skills/shared/external/swift-security/references/testing-security-code.md +354 -614
  202. package/pipeline/skills/shared/external/swift-testing/SKILL.md +188 -175
  203. package/pipeline/skills/shared/external/swift-testing/evals/evals.json +26 -24
  204. package/pipeline/skills/shared/external/swift-testing/references/testing-advanced.md +80 -84
  205. package/pipeline/skills/shared/external/swift-testing/references/testing-patterns.md +317 -433
  206. package/pipeline/skills/shared/external/swiftdata/SKILL.md +392 -256
  207. package/pipeline/skills/shared/external/swiftdata/evals/evals.json +24 -24
  208. package/pipeline/skills/shared/external/swiftdata/references/core-data-coexistence.md +206 -402
  209. package/pipeline/skills/shared/external/swiftdata/references/indexing.md +59 -52
  210. package/pipeline/skills/shared/external/swiftdata/references/predicate-pitfalls.md +57 -33
  211. package/pipeline/skills/shared/external/swiftdata/references/swiftdata-advanced.md +354 -747
  212. package/pipeline/skills/shared/external/swiftdata/references/swiftdata-queries.md +300 -508
  213. package/pipeline/skills/shared/external/swiftlint/SKILL.md +175 -226
  214. package/pipeline/skills/shared/external/swiftlint/references/adoption-and-configuration.md +141 -208
  215. package/pipeline/skills/shared/external/swiftlint/references/custom-rules-and-analyze.md +100 -109
  216. package/pipeline/skills/shared/external/swiftlint/references/plugins-run-scripts-and-integrations.md +159 -179
  217. package/pipeline/skills/shared/external/swiftlint/references/rule-reference.md +383 -18
  218. package/pipeline/skills/shared/external/swiftlint/references/rules-suppressions-and-baselines.md +143 -229
  219. package/pipeline/skills/shared/external/swiftui-animation/SKILL.md +283 -366
  220. package/pipeline/skills/shared/external/swiftui-animation/references/animation-advanced.md +396 -608
  221. package/pipeline/skills/shared/external/swiftui-animation/references/core-animation-bridge.md +336 -385
  222. package/pipeline/skills/shared/external/swiftui-gestures/SKILL.md +239 -349
  223. package/pipeline/skills/shared/external/swiftui-gestures/references/gesture-patterns.md +228 -310
  224. package/pipeline/skills/shared/external/swiftui-layout-components/SKILL.md +260 -249
  225. package/pipeline/skills/shared/external/swiftui-layout-components/references/form.md +92 -74
  226. package/pipeline/skills/shared/external/swiftui-layout-components/references/grids.md +112 -177
  227. package/pipeline/skills/shared/external/swiftui-layout-components/references/list.md +61 -64
  228. package/pipeline/skills/shared/external/swiftui-layout-components/references/scrollview.md +94 -134
  229. package/pipeline/skills/shared/external/swiftui-liquid-glass/SKILL.md +193 -225
  230. package/pipeline/skills/shared/external/swiftui-liquid-glass/references/liquid-glass.md +173 -327
  231. package/pipeline/skills/shared/external/swiftui-navigation/SKILL.md +193 -168
  232. package/pipeline/skills/shared/external/swiftui-navigation/references/deeplinks.md +127 -150
  233. package/pipeline/skills/shared/external/swiftui-navigation/references/navigationstack.md +132 -133
  234. package/pipeline/skills/shared/external/swiftui-navigation/references/sheets.md +152 -117
  235. package/pipeline/skills/shared/external/swiftui-navigation/references/tabview.md +106 -140
  236. package/pipeline/skills/shared/external/swiftui-patterns/SKILL.md +316 -252
  237. package/pipeline/skills/shared/external/swiftui-patterns/references/architecture-patterns.md +341 -332
  238. package/pipeline/skills/shared/external/swiftui-patterns/references/deprecated-migration.md +547 -854
  239. package/pipeline/skills/shared/external/swiftui-patterns/references/design-polish.md +485 -537
  240. package/pipeline/skills/shared/external/swiftui-patterns/references/platform-and-sharing.md +417 -499
  241. package/pipeline/skills/shared/external/swiftui-performance/SKILL.md +213 -376
  242. package/pipeline/skills/shared/external/swiftui-performance/references/demystify-swiftui-performance-wwdc23.md +86 -175
  243. package/pipeline/skills/shared/external/swiftui-performance/references/optimizing-swiftui-performance-instruments.md +89 -195
  244. package/pipeline/skills/shared/external/swiftui-performance/references/understanding-hangs-in-your-app.md +95 -182
  245. package/pipeline/skills/shared/external/swiftui-performance/references/understanding-improving-swiftui-performance.md +71 -149
  246. package/pipeline/skills/shared/external/swiftui-performance/references/wwdc-session-sources.md +21 -27
  247. package/pipeline/skills/shared/external/swiftui-uikit-interop/SKILL.md +303 -295
  248. package/pipeline/skills/shared/external/swiftui-uikit-interop/references/hosting-migration.md +204 -387
  249. package/pipeline/skills/shared/external/swiftui-uikit-interop/references/representable-recipes.md +469 -683
  250. package/pipeline/skills/shared/external/swiftui-webkit/SKILL.md +140 -186
  251. package/pipeline/skills/shared/external/swiftui-webkit/references/loading-and-observation.md +75 -86
  252. package/pipeline/skills/shared/external/swiftui-webkit/references/local-content-and-custom-schemes.md +63 -60
  253. package/pipeline/skills/shared/external/swiftui-webkit/references/migration-and-fallbacks.md +69 -137
  254. package/pipeline/skills/shared/external/swiftui-webkit/references/navigation-and-javascript.md +95 -67
  255. package/pipeline/skills/shared/external/tipkit/SKILL.md +220 -335
  256. package/pipeline/skills/shared/external/tipkit/references/tipkit-patterns.md +356 -494
  257. package/pipeline/skills/shared/external/vision-framework/SKILL.md +260 -375
  258. package/pipeline/skills/shared/external/vision-framework/references/vision-requests.md +393 -515
  259. package/pipeline/skills/shared/external/vision-framework/references/visionkit-scanner.md +363 -539
  260. package/pipeline/skills/shared/external/weatherkit/SKILL.md +152 -310
  261. package/pipeline/skills/shared/external/weatherkit/references/weatherkit-patterns.md +288 -407
  262. package/pipeline/skills/shared/external/widgetkit/SKILL.md +216 -288
  263. package/pipeline/skills/shared/external/widgetkit/references/widgetkit-advanced.md +414 -719
  264. package/pipeline/skills/shared/external/NOTICE-swift-ios-skills.md +0 -39
@@ -1,444 +1,292 @@
1
1
  ---
2
2
  name: natural-language
3
- description: "Tokenize, tag, and analyze natural language text using Apple's NaturalLanguage framework and translate between languages with the Translation framework. Use when adding language identification, sentiment analysis, named entity recognition, part-of-speech tagging, text embeddings, or in-app translation to iOS/macOS/visionOS apps."
3
+ description: "NaturalLanguage and Translation frameworks: tokenizing, language identification, part-of-speech tagging, named entities, sentiment, word and sentence embeddings, custom NLModel classifiers, translation sheet, TranslationSession, batch translation. Use when analyzing or translating text in-app on iOS, macOS or visionOS."
4
4
  metadata:
5
- source: "dpearson2699/swift-ios-skills (PolyForm Perimeter 1.0.0)"
5
+ source: multi-agent-pipeline
6
6
  ---
7
7
 
8
- # NaturalLanguage + Translation
9
-
10
- Analyze natural language text for tokenization, part-of-speech tagging, named
11
- entity recognition, sentiment analysis, language identification, and word/sentence
12
- embeddings. Translate text between languages with the Translation framework.
13
- Targets Swift 6.3 / iOS 26+.
14
-
15
- > This skill covers two related frameworks: **NaturalLanguage** (`NLTokenizer`, `NLTagger`, `NLEmbedding`) for on-device text analysis, and **Translation** (`TranslationSession`, `LanguageAvailability`) for language translation.
16
-
17
- **Scope boundary:** Use this skill after you already have text. It owns
18
- tokenization, language identification, POS/NER tagging, sentiment, embeddings,
19
- custom `NLModel` classifiers/taggers, and in-app translation. Hand off OCR to
20
- `vision-framework`, speech-to-text to `speech-recognition`, UI strings and
21
- locale formatting to `ios-localization`, and generative summarization or Apple
22
- Intelligence workflows to `apple-on-device-ai`.
23
-
24
- ## Contents
25
-
26
- - [Setup](#setup)
27
- - [Tokenization](#tokenization)
28
- - [Language Identification](#language-identification)
29
- - [Part-of-Speech Tagging](#part-of-speech-tagging)
30
- - [Named Entity Recognition](#named-entity-recognition)
31
- - [Sentiment Analysis](#sentiment-analysis)
32
- - [Text Embeddings](#text-embeddings)
33
- - [Translation](#translation)
34
- - [Common Mistakes](#common-mistakes)
35
- - [Review Checklist](#review-checklist)
36
- - [References](#references)
37
-
38
- ## Setup
39
-
40
- Import `NaturalLanguage` for text analysis and `Translation` for language
41
- translation. No special entitlements or capabilities are required for
42
- NaturalLanguage. Translation has split availability: system translation
43
- presentation is iOS 17.4+ / macOS 14.4+, while `TranslationSession`,
44
- `.translationTask()`, `LanguageAvailability`, and batch translation require
45
- iOS 18+ / macOS 15+.
46
- Direct `TranslationSession(installedSource:target:)` is the non-UI option, but
47
- only when the source and target languages are already installed on device.
8
+ # NaturalLanguage and Translation
48
9
 
49
- ```swift
50
- import NaturalLanguage
51
- import Translation
52
- ```
10
+ Two frameworks, one job each. NaturalLanguage analyses text on the device:
11
+ tokens, languages, word classes, entities, sentiment, embeddings and custom
12
+ Create ML models. Translation turns text from one language into another,
13
+ either through a system sheet or through a session you drive. Code assumes
14
+ Swift 6.3 and an iOS 26 deployment target.
15
+
16
+ ## Scope
53
17
 
54
- NaturalLanguage classes (`NLTokenizer`, `NLTagger`) are **not thread-safe**.
55
- Use each instance from one thread or dispatch queue at a time.
18
+ This skill starts once you already have text. Hand off elsewhere for:
56
19
 
57
- ## Tokenization
20
+ | Need | Skill |
21
+ |---|---|
22
+ | Reading text out of images (OCR) | `vision-framework` |
23
+ | Turning speech into text | `speech-recognition` |
24
+ | UI strings, String Catalogs, plurals, right-to-left layout, locale formatting | `ios-localization` |
25
+ | Generative summaries and other Apple Intelligence features | `apple-on-device-ai` |
58
26
 
59
- Segment text into words, sentences, or paragraphs with `NLTokenizer`.
27
+ ## Setup and availability
60
28
 
61
29
  ```swift
62
30
  import NaturalLanguage
63
-
64
- func tokenizeWords(in text: String) -> [String] {
65
- let tokenizer = NLTokenizer(unit: .word)
66
- tokenizer.string = text
67
-
68
- let range = text.startIndex..<text.endIndex
69
- return tokenizer.tokens(for: range).map { String(text[$0]) }
70
- }
31
+ import Translation
71
32
  ```
72
33
 
73
- ### Token Units
34
+ NaturalLanguage needs no capability or entitlement. For Translation:
74
35
 
75
- | Unit | Description |
36
+ | API | Minimum |
76
37
  |---|---|
77
- | `.word` | Individual words |
78
- | `.sentence` | Sentences |
79
- | `.paragraph` | Paragraphs |
80
- | `.document` | Entire document |
38
+ | `.translationPresentation(isPresented:text:)` system sheet | iOS 17.4, macOS 14.4 |
39
+ | `TranslationSession`, `.translationTask`, `LanguageAvailability`, batch requests | iOS 18, macOS 15 |
40
+ | `TranslationSession(installedSource:target:)` without any UI | iOS 26, macOS 26 |
41
+ | `TranslationSession.Strategy` selection | iOS 26.4, macOS 26.4 |
81
42
 
82
- ### Enumerating with Attributes
43
+ The Translation APIs are marked unavailable on visionOS, tvOS and watchOS
44
+ in the 26 SDKs; NaturalLanguage itself works on every Apple platform.
45
+ Use the UI-free `installedSource` initializer only when both languages are
46
+ already downloaded.
83
47
 
84
- Use `enumerateTokens(in:using:)` to detect numeric or emoji tokens.
48
+ `NLTokenizer` and `NLTagger` are not thread-safe. Keep each instance on a
49
+ single thread or queue at a time.
85
50
 
86
- ```swift
87
- let tokenizer = NLTokenizer(unit: .word)
88
- tokenizer.string = text
51
+ ## Tokenizing
89
52
 
90
- tokenizer.enumerateTokens(in: text.startIndex..<text.endIndex) { range, attributes in
91
- if attributes.contains(.numeric) {
92
- print("Number: \(text[range])")
93
- }
94
- return true // continue enumeration
95
- }
53
+ ```swift
54
+ let splitter = NLTokenizer(unit: .sentence)
55
+ splitter.string = review
56
+ let sentences = splitter.tokens(for: review.startIndex..<review.endIndex).map { review[$0] }
96
57
  ```
97
58
 
98
- ## Language Identification
99
-
100
- Detect the dominant language of a string with `NLLanguageRecognizer`.
59
+ Units are `.word`, `.sentence`, `.paragraph` and `.document`. Enumeration
60
+ also reports token attributes such as numbers and emoji:
101
61
 
102
62
  ```swift
103
- func detectLanguage(for text: String) -> NLLanguage? {
104
- NLLanguageRecognizer.dominantLanguage(for: text)
105
- }
106
-
107
- // Multiple hypotheses with confidence scores
108
- func languageHypotheses(for text: String, max: Int = 5) -> [NLLanguage: Double] {
109
- let recognizer = NLLanguageRecognizer()
110
- recognizer.processString(text)
111
- return recognizer.languageHypotheses(withMaximum: max)
63
+ let words = NLTokenizer(unit: .word)
64
+ words.string = receipt
65
+ words.enumerateTokens(in: receipt.startIndex..<receipt.endIndex) { span, traits in
66
+ if traits.contains(.numeric) { amounts.append(String(receipt[span])) }
67
+ return true // keep going
112
68
  }
113
69
  ```
114
70
 
115
- Constrain the recognizer to expected languages for better accuracy on short text.
71
+ ## Identifying the language
116
72
 
117
73
  ```swift
74
+ let guess = NLLanguageRecognizer.dominantLanguage(for: "Hvor er togstationen?")
75
+
118
76
  let recognizer = NLLanguageRecognizer()
119
- recognizer.languageConstraints = [.english, .french, .spanish]
120
- recognizer.processString(text)
121
- let detected = recognizer.dominantLanguage
77
+ recognizer.processString(snippet)
78
+ let ranked = recognizer.languageHypotheses(withMaximum: 3) // [NLLanguage: Double]
79
+
80
+ recognizer.reset()
81
+ recognizer.languageConstraints = [.danish, .norwegian, .swedish]
82
+ recognizer.processString(snippet)
83
+ let bestNordic = recognizer.dominantLanguage
122
84
  ```
123
85
 
124
- ## Part-of-Speech Tagging
86
+ Constraining the candidate set helps a lot with short input.
125
87
 
126
- Identify nouns, verbs, adjectives, and other lexical classes with `NLTagger`.
88
+ ## Part-of-speech tagging
127
89
 
128
90
  ```swift
129
- func tagPartsOfSpeech(in text: String) -> [(String, NLTag)] {
130
- let tagger = NLTagger(tagSchemes: [.lexicalClass])
131
- tagger.string = text
132
-
133
- var results: [(String, NLTag)] = []
134
- let range = text.startIndex..<text.endIndex
135
- let options: NLTagger.Options = [.omitPunctuation, .omitWhitespace]
136
-
137
- tagger.enumerateTags(in: range, unit: .word, scheme: .lexicalClass, options: options) { tag, tokenRange in
138
- if let tag {
139
- results.append((String(text[tokenRange]), tag))
140
- }
141
- return true
142
- }
143
- return results
91
+ let tagger = NLTagger(tagSchemes: [.lexicalClass])
92
+ tagger.string = sentence
93
+ tagger.enumerateTags(in: sentence.startIndex..<sentence.endIndex,
94
+ unit: .word,
95
+ scheme: .lexicalClass,
96
+ options: [.omitPunctuation, .omitWhitespace]) { tag, span in
97
+ if tag == .verb { verbs.append(String(sentence[span])) }
98
+ return true
144
99
  }
145
100
  ```
146
101
 
147
- ### Common Tag Schemes
148
-
149
- | Scheme | Output |
102
+ | Scheme | Produces |
150
103
  |---|---|
151
- | `.lexicalClass` | Part of speech (noun, verb, adjective) |
152
- | `.nameType` | Named entity type (person, place, organization) |
153
- | `.nameTypeOrLexicalClass` | Combined NER + POS |
154
- | `.lemma` | Base form of a word |
155
- | `.language` | Per-token language |
156
- | `.sentimentScore` | Sentiment polarity score |
157
-
158
- ## Named Entity Recognition
104
+ | `.lexicalClass` | Word class: noun, verb, adjective and so on |
105
+ | `.nameType` | Entity type |
106
+ | `.nameTypeOrLexicalClass` | Entity type where there is one, word class otherwise |
107
+ | `.lemma` | Dictionary form of the word |
108
+ | `.language` | Language of each token |
109
+ | `.sentimentScore` | Polarity score |
159
110
 
160
- Extract people, places, and organizations.
111
+ ## Named entities
161
112
 
162
113
  ```swift
163
- func extractEntities(from text: String) -> [(String, NLTag)] {
164
- let tagger = NLTagger(tagSchemes: [.nameType])
165
- tagger.string = text
166
-
167
- var entities: [(String, NLTag)] = []
168
- let options: NLTagger.Options = [.omitPunctuation, .omitWhitespace, .joinNames]
169
-
170
- tagger.enumerateTags(
171
- in: text.startIndex..<text.endIndex,
172
- unit: .word,
173
- scheme: .nameType,
174
- options: options
175
- ) { tag, tokenRange in
176
- if let tag, tag != .other {
177
- entities.append((String(text[tokenRange]), tag))
178
- }
179
- return true
114
+ let finder = NLTagger(tagSchemes: [.nameType])
115
+ finder.string = article
116
+ finder.enumerateTags(in: article.startIndex..<article.endIndex,
117
+ unit: .word,
118
+ scheme: .nameType,
119
+ options: [.omitPunctuation, .omitWhitespace, .joinNames]) { tag, span in
120
+ guard let tag, tag != .other else { return true }
121
+ switch tag {
122
+ case .personalName: people.insert(String(article[span]))
123
+ case .placeName: places.insert(String(article[span]))
124
+ case .organizationName: companies.insert(String(article[span]))
125
+ default: break
180
126
  }
181
- return entities
127
+ return true
182
128
  }
183
- // NLTag values: .personalName, .placeName, .organizationName
184
129
  ```
185
130
 
186
- ## Sentiment Analysis
131
+ `.joinNames` keeps "Ada Lovelace" together as one entity.
132
+
133
+ ## Sentiment
187
134
 
188
- Score text sentiment from -1.0 (negative) to +1.0 (positive).
135
+ Scores run from -1.0 (negative) to +1.0 (positive). Some languages have no
136
+ model, so the result is optional.
189
137
 
190
138
  ```swift
191
- func sentimentScore(for text: String) -> Double? {
192
- let tagger = NLTagger(tagSchemes: [.sentimentScore])
193
- tagger.string = text
194
-
195
- let (tag, _) = tagger.tag(
196
- at: text.startIndex,
197
- unit: .paragraph,
198
- scheme: .sentimentScore
199
- )
139
+ func mood(of paragraph: String) -> Double? {
140
+ let scorer = NLTagger(tagSchemes: [.sentimentScore])
141
+ scorer.string = paragraph
142
+ let (tag, _) = scorer.tag(at: paragraph.startIndex, unit: .paragraph, scheme: .sentimentScore)
200
143
  return tag.flatMap { Double($0.rawValue) }
201
144
  }
202
145
  ```
203
146
 
204
- ## Text Embeddings
205
-
206
- Measure semantic similarity between words or sentences with `NLEmbedding`.
147
+ ## Embeddings
207
148
 
208
149
  ```swift
209
- func wordSimilarity(_ word1: String, _ word2: String) -> Double? {
210
- guard let embedding = NLEmbedding.wordEmbedding(for: .english) else { return nil }
211
- return embedding.distance(between: word1, and: word2, distanceType: .cosine)
150
+ func wordNeighbors() -> (gap: NLDistance, similar: [(String, NLDistance)])? {
151
+ guard let vectors = NLEmbedding.wordEmbedding(for: .english) else { return nil }
152
+ let gap = vectors.distance(between: "harbor", and: "port", distanceType: .cosine)
153
+ let similar = vectors.neighbors(for: "harbor", maximumCount: 5, distanceType: .cosine)
154
+ return (gap, similar)
212
155
  }
213
156
 
214
- func findSimilarWords(to word: String, count: Int = 5) -> [(String, Double)] {
215
- guard let embedding = NLEmbedding.wordEmbedding(for: .english) else { return [] }
216
- return embedding.neighbors(for: word, maximumCount: count, distanceType: .cosine)
157
+ func sentenceGap() -> NLDistance? {
158
+ NLEmbedding.sentenceEmbedding(for: .english)?.distance(between: "The ferry is late.",
159
+ and: "Our boat has been delayed.",
160
+ distanceType: .cosine)
217
161
  }
218
162
  ```
219
163
 
220
- Sentence embeddings compare entire sentences.
221
-
222
- ```swift
223
- func sentenceSimilarity(_ s1: String, _ s2: String) -> Double? {
224
- guard let embedding = NLEmbedding.sentenceEmbedding(for: .english) else { return nil }
225
- return embedding.distance(between: s1, and: s2, distanceType: .cosine)
226
- }
227
- ```
164
+ Not every language ships embeddings; both factories can return `nil`.
165
+ `NLDistance` is a `Double`; smaller means closer.
228
166
 
229
167
  ## Translation
230
168
 
231
- ### System Translation Overlay
232
-
233
- Show the built-in translation UI with `.translationPresentation()`.
169
+ ### The system sheet
234
170
 
235
171
  ```swift
236
- import SwiftUI
237
- import Translation
238
-
239
- struct TranslatableView: View {
240
- @State private var showTranslation = false
241
- let text = "Hello, how are you?"
172
+ struct PhraseCard: View {
173
+ let phrase: String
174
+ @State private var showsTranslation = false
242
175
 
243
176
  var body: some View {
244
- Button { showTranslation = true } label: {
245
- Text(text)
246
- }
247
- .buttonStyle(.plain)
248
- .translationPresentation(
249
- isPresented: $showTranslation,
250
- text: text
251
- )
177
+ Button(phrase) { showsTranslation = true }
178
+ .buttonStyle(.plain)
179
+ .translationPresentation(isPresented: $showsTranslation, text: phrase)
252
180
  }
253
181
  }
254
182
  ```
255
183
 
256
- ### Programmatic Translation
184
+ ### Translating in code
257
185
 
258
- Use `.translationTask()` for programmatic translations within a view context.
186
+ `.translationTask` hands you a session whenever its configuration becomes
187
+ non-nil or changes, so assigning a configuration is what starts the work.
188
+ Written inside `body`, the action closure is main-actor isolated, and
189
+ `TranslationSession` is not `Sendable`: Swift 6 rejects calling
190
+ `translate(_:)` from there. Mark the closure `@concurrent` and hop back to the
191
+ main actor to store the result.
259
192
 
260
193
  ```swift
261
- struct TranslatingView: View {
262
- @State private var translatedText = ""
263
- @State private var translationErrorMessage: String?
264
- @State private var configuration: TranslationSession.Configuration?
194
+ struct MenuTranslator: View {
195
+ let dish: String
196
+ @State private var request: TranslationSession.Configuration?
197
+ @State private var output = ""
265
198
 
266
199
  var body: some View {
267
200
  VStack {
268
- Text(translatedText)
269
- Button("Translate") {
270
- configuration = .init(source: Locale.Language(identifier: "en"),
271
- target: Locale.Language(identifier: "es"))
201
+ Text(output)
202
+ Button("Translate to Japanese") {
203
+ request = .init(source: Locale.Language(identifier: "it"),
204
+ target: Locale.Language(identifier: "ja"))
272
205
  }
273
206
  }
274
- .translationTask(configuration) { session in
207
+ .translationTask(request) { @concurrent session in
275
208
  do {
276
- let response = try await session.translate("Hello, world!")
277
- await MainActor.run {
278
- translatedText = response.targetText
279
- translationErrorMessage = nil
280
- }
209
+ let reply = try await session.translate(dish)
210
+ await MainActor.run { output = reply.targetText }
281
211
  } catch {
282
- let message = error.localizedDescription
283
- await MainActor.run {
284
- translationErrorMessage = message
285
- }
212
+ await MainActor.run { output = "Translation failed: \(error.localizedDescription)" }
286
213
  }
287
214
  }
288
215
  }
289
216
  }
290
217
  ```
291
218
 
292
- ### Batch Translation
219
+ ### Several strings at once
293
220
 
294
- Translate multiple strings in a single session.
221
+ Give each request a `clientIdentifier` so you can match answers to inputs.
295
222
 
296
223
  ```swift
297
- .translationTask(configuration) { session in
298
- do {
299
- let requests = texts.enumerated().map { index, text in
300
- TranslationSession.Request(sourceText: text,
301
- clientIdentifier: "\(index)")
302
- }
303
- let responses = try await session.translations(from: requests)
304
- for response in responses {
305
- print("\(response.sourceText) -> \(response.targetText)")
306
- }
307
- } catch {
308
- // Handle cancellation, unsupported languages, or download refusal.
309
- }
224
+ let requests = menuItems.map {
225
+ TranslationSession.Request(sourceText: $0.name, clientIdentifier: $0.id)
310
226
  }
311
- ```
312
-
313
- ### Checking Language Availability
314
-
315
- ```swift
316
- let availability = LanguageAvailability()
317
- let status = await availability.status(
318
- from: Locale.Language(identifier: "en"),
319
- to: Locale.Language(identifier: "ja")
320
- )
321
- switch status {
322
- case .installed: break // Ready to translate offline
323
- case .supported: break // Needs download
324
- case .unsupported: break // Language pair not available
325
- }
326
- ```
327
-
328
- ## Common Mistakes
329
-
330
- ### DON'T: Share NLTagger/NLTokenizer across threads
331
-
332
- These classes are not thread-safe and will produce incorrect results or crash.
333
-
334
- ```swift
335
- // WRONG
336
- let sharedTagger = NLTagger(tagSchemes: [.lexicalClass])
337
- DispatchQueue.concurrentPerform(iterations: 10) { _ in
338
- sharedTagger.string = someText // Data race
339
- }
340
-
341
- // CORRECT
342
- await withTaskGroup(of: Void.self) { group in
343
- for _ in 0..<10 {
344
- group.addTask {
345
- let tagger = NLTagger(tagSchemes: [.lexicalClass])
346
- tagger.string = someText
347
- // process...
348
- }
227
+ do {
228
+ let answers = try await session.translations(from: requests)
229
+ for answer in answers {
230
+ translated[answer.clientIdentifier ?? ""] = answer.targetText
349
231
  }
232
+ } catch {
233
+ // cancelled, unsupported pair, or the user declined the download
350
234
  }
351
235
  ```
352
236
 
353
- ### DON'T: Confuse NaturalLanguage with Core ML
354
-
355
- NaturalLanguage provides built-in linguistic analysis. Use Core ML for custom
356
- trained models. They complement each other via `NLModel`.
357
-
358
- ```swift
359
- // WRONG: Trying to do NER with raw Core ML
360
- let coreMLModel = try MLModel(contentsOf: modelURL)
361
-
362
- // CORRECT: Use NLTagger for built-in NER
363
- let tagger = NLTagger(tagSchemes: [.nameType])
364
-
365
- // Or load a custom Core ML model via NLModel
366
- let nlModel = try NLModel(mlModel: coreMLModel)
367
- tagger.setModels([nlModel], forTagScheme: .nameType)
368
- ```
369
-
370
- ### DON'T: Assume embeddings exist for all languages
371
-
372
- Not all languages have word or sentence embeddings available on device.
373
-
374
- ```swift
375
- // WRONG: Force unwrap
376
- let embedding = NLEmbedding.wordEmbedding(for: .japanese)!
377
-
378
- // CORRECT: Handle nil
379
- guard let embedding = NLEmbedding.wordEmbedding(for: .japanese) else {
380
- // Embedding not available for this language
381
- return
382
- }
383
- ```
384
-
385
- ### DON'T: Create a new tagger per token
386
-
387
- Creating and configuring a tagger is expensive. Reuse it for the same text.
237
+ ### Checking a language pair first
388
238
 
389
239
  ```swift
390
- // WRONG: New tagger per word
391
- for word in words {
392
- let tagger = NLTagger(tagSchemes: [.lexicalClass])
393
- tagger.string = word
394
- }
395
-
396
- // CORRECT: Set string once, enumerate
397
- let tagger = NLTagger(tagSchemes: [.lexicalClass])
398
- tagger.string = fullText
399
- tagger.enumerateTags(in: fullText.startIndex..<fullText.endIndex,
400
- unit: .word, scheme: .lexicalClass, options: []) { tag, range in
401
- return true
240
+ let pairState = await LanguageAvailability().status(
241
+ from: Locale.Language(identifier: "pt"),
242
+ to: Locale.Language(identifier: "de")
243
+ )
244
+ switch pairState {
245
+ case .installed: break // ready offline
246
+ case .supported: break // works after a download
247
+ case .unsupported: break // cannot translate this pair
248
+ @unknown default: break
402
249
  }
403
250
  ```
404
251
 
405
- ### DON'T: Ignore language hints for short text
406
-
407
- Language detection on short strings (under ~20 characters) is unreliable.
408
- Set constraints or hints to improve accuracy.
409
-
410
- ```swift
411
- // WRONG: Detect language of a single word
412
- let lang = NLLanguageRecognizer.dominantLanguage(for: "chat") // French or English?
413
-
414
- // CORRECT: Provide context
415
- let recognizer = NLLanguageRecognizer()
416
- recognizer.languageHints = [.english: 0.8, .french: 0.2]
417
- recognizer.processString("chat")
418
- ```
419
-
420
- ## Review Checklist
421
-
422
- - [ ] `NLTokenizer` and `NLTagger` instances used from a single thread
252
+ ## Common mistakes
253
+
254
+ - **Sharing a tagger between threads.** Driving one `NLTagger` from
255
+ `concurrentPerform` is a data race. Give each task its own instance, for
256
+ example one per child task in a task group.
257
+ - **Confusing NaturalLanguage with Core ML.** NaturalLanguage covers the
258
+ built-in analyses. A custom model trained in Create ML comes in through
259
+ `NLModel(mlModel:)` and `tagger.setModels(_:forTagScheme:)`, not as a raw
260
+ `MLModel` wired up by hand.
261
+ - **Force-unwrapping `wordEmbedding(for:)`.** Many languages have none.
262
+ - **A tagger per token.** Create the tagger once, set the whole string, then
263
+ enumerate.
264
+ - **Trusting detection on tiny strings.** Under about 20 characters it is
265
+ guesswork; add `languageHints` such as `[.english: 0.8, .french: 0.2]` or
266
+ `languageConstraints`.
267
+
268
+ ## Review checklist
269
+
270
+ - [ ] Each tokenizer and tagger used from one thread at a time
423
271
  - [ ] Tagger created once per text, not per token
424
- - [ ] Language detection uses constraints/hints for short text
425
- - [ ] `NLEmbedding` availability checked before use (returns nil if unavailable)
426
- - [ ] Translation `LanguageAvailability` checked before attempting translation
427
- - [ ] `.translationTask()` used within a SwiftUI view hierarchy
428
- - [ ] Batch translation uses `clientIdentifier` to match responses to requests
429
- - [ ] Sentiment scores handled as optional (may return nil for unsupported languages)
430
- - [ ] `.joinNames` option used with NER to keep multi-word names together
431
- - [ ] Custom ML models loaded via `NLModel`, not raw Core ML
272
+ - [ ] Short text gets constraints or hints
273
+ - [ ] `NLEmbedding` results checked for `nil`
274
+ - [ ] `LanguageAvailability` consulted before translating
275
+ - [ ] `.translationTask` attached inside the SwiftUI view hierarchy
276
+ - [ ] Batch requests carry a `clientIdentifier`
277
+ - [ ] Sentiment handled as optional (unsupported languages give `nil`)
278
+ - [ ] Entity extraction uses `.joinNames`
279
+ - [ ] Custom models loaded through `NLModel`
432
280
 
433
281
  ## References
434
282
 
435
- - Extended patterns (custom models, contextual embeddings, gazetteers): [references/translation-patterns.md](references/translation-patterns.md)
436
- - [Natural Language framework](https://sosumi.ai/documentation/naturallanguage)
437
- - [NLTokenizer](https://sosumi.ai/documentation/naturallanguage/nltokenizer)
438
- - [NLTagger](https://sosumi.ai/documentation/naturallanguage/nltagger)
439
- - [NLEmbedding](https://sosumi.ai/documentation/naturallanguage/nlembedding)
440
- - [NLLanguageRecognizer](https://sosumi.ai/documentation/naturallanguage/nllanguagerecognizer)
441
- - [Translation framework](https://sosumi.ai/documentation/translation)
442
- - [TranslationSession](https://sosumi.ai/documentation/translation/translationsession)
443
- - [TranslationSession.Strategy](https://sosumi.ai/documentation/translation/translationsession/strategy)
444
- - [LanguageAvailability](https://sosumi.ai/documentation/translation/languageavailability)
283
+ - [translation and analysis patterns](references/translation-patterns.md): custom models, contextual embeddings, gazetteers, multi-scheme tagging, in-place translation, strategies, session preparation, SwiftUI analyzer, tagger assets, lemmas
284
+ - https://developer.apple.com/documentation/naturallanguage
285
+ - https://developer.apple.com/documentation/naturallanguage/nltokenizer
286
+ - https://developer.apple.com/documentation/naturallanguage/nltagger
287
+ - https://developer.apple.com/documentation/naturallanguage/nlembedding
288
+ - https://developer.apple.com/documentation/naturallanguage/nllanguagerecognizer
289
+ - https://developer.apple.com/documentation/translation
290
+ - https://developer.apple.com/documentation/translation/translationsession
291
+ - https://developer.apple.com/documentation/translation/translationsession/strategy
292
+ - https://developer.apple.com/documentation/translation/languageavailability