@mmerterden/multi-agent-pipeline 20.7.0 → 20.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (284) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/LICENSE +0 -10
  3. package/docs/facts.json +1 -1
  4. package/manifest.json +285 -285
  5. package/package.json +3 -3
  6. package/pipeline/lib/redact.mjs +3 -2
  7. package/pipeline/scripts/_notices.mjs +1 -1
  8. package/pipeline/scripts/gen-skills-index.mjs +13 -1
  9. package/pipeline/scripts/pre-commit-check.sh +4 -0
  10. package/pipeline/skills/.skill-manifest.json +69 -69
  11. package/pipeline/skills/shared/README.md +70 -70
  12. package/pipeline/skills/shared/external/alarmkit/SKILL.md +373 -381
  13. package/pipeline/skills/shared/external/alarmkit/evals/evals.json +23 -18
  14. package/pipeline/skills/shared/external/alarmkit/references/alarmkit-patterns.md +328 -378
  15. package/pipeline/skills/shared/external/app-clips/SKILL.md +260 -160
  16. package/pipeline/skills/shared/external/app-clips/evals/evals.json +27 -27
  17. package/pipeline/skills/shared/external/app-clips/references/data-handoff-notifications-location.md +150 -83
  18. package/pipeline/skills/shared/external/app-clips/references/routing-and-experiences.md +135 -83
  19. package/pipeline/skills/shared/external/app-clips/references/size-capabilities-and-promotion.md +143 -85
  20. package/pipeline/skills/shared/external/app-intents/SKILL.md +302 -304
  21. package/pipeline/skills/shared/external/app-intents/evals/evals.json +21 -21
  22. package/pipeline/skills/shared/external/app-intents/references/appintents-advanced.md +594 -894
  23. package/pipeline/skills/shared/external/app-store-optimization/SKILL.md +345 -277
  24. package/pipeline/skills/shared/external/app-store-optimization/evals/evals.json +27 -23
  25. package/pipeline/skills/shared/external/app-store-optimization/references/keyword-research-methodology.md +107 -121
  26. package/pipeline/skills/shared/external/app-store-optimization/references/product-page-variants.md +145 -165
  27. package/pipeline/skills/shared/external/app-store-review/SKILL.md +306 -326
  28. package/pipeline/skills/shared/external/app-store-review/evals/evals.json +21 -21
  29. package/pipeline/skills/shared/external/app-store-review/references/privacy-manifest.md +105 -67
  30. package/pipeline/skills/shared/external/app-store-review/references/review-checklists.md +114 -101
  31. package/pipeline/skills/shared/external/apple-on-device-ai/SKILL.md +335 -360
  32. package/pipeline/skills/shared/external/apple-on-device-ai/evals/evals.json +24 -27
  33. package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-conversion.md +215 -322
  34. package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-optimization.md +161 -256
  35. package/pipeline/skills/shared/external/apple-on-device-ai/references/foundation-models.md +277 -387
  36. package/pipeline/skills/shared/external/apple-on-device-ai/references/mlx-swift.md +196 -210
  37. package/pipeline/skills/shared/external/authentication/SKILL.md +277 -381
  38. package/pipeline/skills/shared/external/authentication/evals/evals.json +25 -25
  39. package/pipeline/skills/shared/external/authentication/references/keychain-biometric.md +135 -178
  40. package/pipeline/skills/shared/external/authentication/references/passkeys.md +111 -147
  41. package/pipeline/skills/shared/external/avkit/SKILL.md +267 -364
  42. package/pipeline/skills/shared/external/avkit/evals/evals.json +26 -26
  43. package/pipeline/skills/shared/external/avkit/references/avkit-patterns.md +375 -493
  44. package/pipeline/skills/shared/external/background-processing/SKILL.md +274 -384
  45. package/pipeline/skills/shared/external/background-processing/evals/evals.json +22 -22
  46. package/pipeline/skills/shared/external/background-processing/references/background-task-patterns.md +173 -321
  47. package/pipeline/skills/shared/external/callkit-voip/SKILL.md +290 -371
  48. package/pipeline/skills/shared/external/callkit-voip/evals/evals.json +24 -24
  49. package/pipeline/skills/shared/external/callkit-voip/references/callkit-patterns.md +175 -343
  50. package/pipeline/skills/shared/external/cloudkit-sync/SKILL.md +292 -381
  51. package/pipeline/skills/shared/external/cloudkit-sync/evals/evals.json +33 -30
  52. package/pipeline/skills/shared/external/cloudkit-sync/references/cloudkit-patterns.md +227 -355
  53. package/pipeline/skills/shared/external/contacts-framework/SKILL.md +197 -346
  54. package/pipeline/skills/shared/external/contacts-framework/evals/evals.json +19 -21
  55. package/pipeline/skills/shared/external/contacts-framework/references/contacts-patterns.md +169 -308
  56. package/pipeline/skills/shared/external/core-bluetooth/SKILL.md +228 -376
  57. package/pipeline/skills/shared/external/core-bluetooth/evals/evals.json +25 -22
  58. package/pipeline/skills/shared/external/core-bluetooth/references/ble-patterns.md +257 -337
  59. package/pipeline/skills/shared/external/core-data/SKILL.md +302 -368
  60. package/pipeline/skills/shared/external/core-data/evals/evals.json +30 -27
  61. package/pipeline/skills/shared/external/core-motion/SKILL.md +235 -324
  62. package/pipeline/skills/shared/external/core-motion/evals/evals.json +31 -27
  63. package/pipeline/skills/shared/external/core-motion/references/motion-patterns.md +210 -310
  64. package/pipeline/skills/shared/external/core-nfc/SKILL.md +292 -366
  65. package/pipeline/skills/shared/external/core-nfc/evals/evals.json +22 -24
  66. package/pipeline/skills/shared/external/core-nfc/references/nfc-patterns.md +233 -329
  67. package/pipeline/skills/shared/external/coreml/SKILL.md +323 -367
  68. package/pipeline/skills/shared/external/coreml/evals/evals.json +24 -21
  69. package/pipeline/skills/shared/external/coreml/references/coreml-swift-integration.md +562 -565
  70. package/pipeline/skills/shared/external/cryptokit/SKILL.md +253 -394
  71. package/pipeline/skills/shared/external/cryptokit/evals/evals.json +20 -18
  72. package/pipeline/skills/shared/external/cryptokit/references/cryptokit-patterns.md +299 -488
  73. package/pipeline/skills/shared/external/debugging-instruments/SKILL.md +270 -323
  74. package/pipeline/skills/shared/external/debugging-instruments/evals/evals.json +27 -30
  75. package/pipeline/skills/shared/external/debugging-instruments/references/instruments-guide.md +167 -315
  76. package/pipeline/skills/shared/external/debugging-instruments/references/lldb-patterns.md +140 -193
  77. package/pipeline/skills/shared/external/device-integrity/SKILL.md +236 -353
  78. package/pipeline/skills/shared/external/device-integrity/evals/evals.json +25 -21
  79. package/pipeline/skills/shared/external/device-integrity/references/device-integrity-patterns.md +159 -197
  80. package/pipeline/skills/shared/external/energykit/SKILL.md +225 -392
  81. package/pipeline/skills/shared/external/energykit/evals/evals.json +29 -28
  82. package/pipeline/skills/shared/external/energykit/references/energykit-patterns.md +174 -470
  83. package/pipeline/skills/shared/external/eventkit-calendar/SKILL.md +261 -383
  84. package/pipeline/skills/shared/external/eventkit-calendar/evals/evals.json +25 -22
  85. package/pipeline/skills/shared/external/eventkit-calendar/references/eventkit-patterns.md +165 -268
  86. package/pipeline/skills/shared/external/healthkit/SKILL.md +252 -303
  87. package/pipeline/skills/shared/external/healthkit/evals/evals.json +24 -23
  88. package/pipeline/skills/shared/external/healthkit/references/healthkit-patterns.md +369 -523
  89. package/pipeline/skills/shared/external/homekit-matter/SKILL.md +233 -348
  90. package/pipeline/skills/shared/external/homekit-matter/evals/evals.json +27 -22
  91. package/pipeline/skills/shared/external/homekit-matter/references/matter-commissioning.md +199 -305
  92. package/pipeline/skills/shared/external/ios-accessibility/SKILL.md +368 -340
  93. package/pipeline/skills/shared/external/ios-accessibility/evals/evals.json +28 -27
  94. package/pipeline/skills/shared/external/ios-accessibility/references/a11y-patterns.md +314 -260
  95. package/pipeline/skills/shared/external/ios-accessibility/references/media-accessibility.md +97 -67
  96. package/pipeline/skills/shared/external/ios-accessibility/references/nutrition-labels.md +165 -101
  97. package/pipeline/skills/shared/external/ios-localization/SKILL.md +258 -371
  98. package/pipeline/skills/shared/external/ios-localization/evals/evals.json +23 -23
  99. package/pipeline/skills/shared/external/ios-localization/references/formatstyle-locale.md +283 -491
  100. package/pipeline/skills/shared/external/ios-localization/references/string-catalogs.md +313 -440
  101. package/pipeline/skills/shared/external/ios-networking/SKILL.md +265 -341
  102. package/pipeline/skills/shared/external/ios-networking/evals/evals.json +24 -24
  103. package/pipeline/skills/shared/external/ios-networking/references/background-websocket.md +425 -652
  104. package/pipeline/skills/shared/external/ios-networking/references/file-storage-patterns.md +143 -285
  105. package/pipeline/skills/shared/external/ios-networking/references/lightweight-clients.md +93 -53
  106. package/pipeline/skills/shared/external/ios-networking/references/network-framework.md +231 -456
  107. package/pipeline/skills/shared/external/ios-networking/references/urlsession-patterns.md +517 -784
  108. package/pipeline/skills/shared/external/ios-simulator/SKILL.md +265 -393
  109. package/pipeline/skills/shared/external/ios-simulator/evals/evals.json +21 -21
  110. package/pipeline/skills/shared/external/ios-simulator/references/simctl-commands.md +177 -270
  111. package/pipeline/skills/shared/external/live-activities/SKILL.md +318 -360
  112. package/pipeline/skills/shared/external/live-activities/evals/evals.json +21 -21
  113. package/pipeline/skills/shared/external/live-activities/references/activitykit-patterns.md +478 -710
  114. package/pipeline/skills/shared/external/localization-reuse-map/SKILL.md +3 -3
  115. package/pipeline/skills/shared/external/localization-reuse-map/example-mapping.json +1 -1
  116. package/pipeline/skills/shared/external/localization-reuse-map/reference/format-and-output.md +8 -7
  117. package/pipeline/skills/shared/external/localization-reuse-map/reference/publish-and-snapshot.md +2 -2
  118. package/pipeline/skills/shared/external/localization-reuse-map/reference/sources-and-recipes.md +5 -2
  119. package/pipeline/skills/shared/external/localization-reuse-map/scripts/_shared.py +100 -0
  120. package/pipeline/skills/shared/external/localization-reuse-map/scripts/build-artifact.py +45 -26
  121. package/pipeline/skills/shared/external/localization-reuse-map/scripts/build-spreadsheet.py +14 -16
  122. package/pipeline/skills/shared/external/localization-reuse-map/scripts/fetch-annotations.py +12 -5
  123. package/pipeline/skills/shared/external/localization-reuse-map/scripts/fetch-legacy-labels.py +2 -1
  124. package/pipeline/skills/shared/external/localization-reuse-map/scripts/publish-confluence.py +6 -5
  125. package/pipeline/skills/shared/external/localization-reuse-map/scripts/render-overlay.py +44 -18
  126. package/pipeline/skills/shared/external/localization-reuse-map/scripts/resolve-legacy-values.py +5 -2
  127. package/pipeline/skills/shared/external/localization-reuse-map/scripts/resolve-new-values.py +10 -11
  128. package/pipeline/skills/shared/external/localization-reuse-map/scripts/scan-screen-keys.py +4 -33
  129. package/pipeline/skills/shared/external/localization-reuse-map/scripts/verify-map.py +12 -59
  130. package/pipeline/skills/shared/external/mapkit-location/SKILL.md +297 -267
  131. package/pipeline/skills/shared/external/mapkit-location/evals/evals.json +28 -24
  132. package/pipeline/skills/shared/external/mapkit-location/references/mapkit-corelocation-patterns.md +378 -532
  133. package/pipeline/skills/shared/external/mapkit-location/references/mapkit-patterns.md +397 -499
  134. package/pipeline/skills/shared/external/metrickit-diagnostics/SKILL.md +165 -348
  135. package/pipeline/skills/shared/external/metrickit-diagnostics/evals/evals.json +26 -23
  136. package/pipeline/skills/shared/external/metrickit-diagnostics/references/metrickit-patterns.md +123 -130
  137. package/pipeline/skills/shared/external/musickit-audio/SKILL.md +189 -315
  138. package/pipeline/skills/shared/external/musickit-audio/evals/evals.json +22 -21
  139. package/pipeline/skills/shared/external/musickit-audio/references/musickit-patterns.md +181 -270
  140. package/pipeline/skills/shared/external/natural-language/SKILL.md +188 -340
  141. package/pipeline/skills/shared/external/natural-language/evals/evals.json +21 -21
  142. package/pipeline/skills/shared/external/natural-language/references/translation-patterns.md +171 -225
  143. package/pipeline/skills/shared/external/passkit-wallet/SKILL.md +258 -392
  144. package/pipeline/skills/shared/external/passkit-wallet/evals/evals.json +30 -29
  145. package/pipeline/skills/shared/external/passkit-wallet/references/wallet-passes.md +164 -231
  146. package/pipeline/skills/shared/external/pdfkit/SKILL.md +312 -344
  147. package/pipeline/skills/shared/external/pdfkit/evals/evals.json +19 -19
  148. package/pipeline/skills/shared/external/pdfkit/references/pdfkit-patterns.md +413 -624
  149. package/pipeline/skills/shared/external/pencilkit-drawing/SKILL.md +242 -358
  150. package/pipeline/skills/shared/external/pencilkit-drawing/evals/evals.json +25 -21
  151. package/pipeline/skills/shared/external/pencilkit-drawing/references/pencilkit-patterns.md +161 -226
  152. package/pipeline/skills/shared/external/permissionkit/SKILL.md +282 -400
  153. package/pipeline/skills/shared/external/permissionkit/evals/evals.json +27 -30
  154. package/pipeline/skills/shared/external/permissionkit/references/permissionkit-patterns.md +237 -350
  155. package/pipeline/skills/shared/external/photos-camera-media/SKILL.md +276 -325
  156. package/pipeline/skills/shared/external/photos-camera-media/references/av-playback.md +299 -545
  157. package/pipeline/skills/shared/external/photos-camera-media/references/camera-capture.md +344 -588
  158. package/pipeline/skills/shared/external/photos-camera-media/references/image-loading-caching.md +316 -660
  159. package/pipeline/skills/shared/external/photos-camera-media/references/photokit-patterns.md +270 -416
  160. package/pipeline/skills/shared/external/push-notifications/SKILL.md +312 -340
  161. package/pipeline/skills/shared/external/push-notifications/evals/evals.json +27 -26
  162. package/pipeline/skills/shared/external/push-notifications/references/notification-patterns.md +328 -485
  163. package/pipeline/skills/shared/external/push-notifications/references/rich-notifications.md +327 -560
  164. package/pipeline/skills/shared/external/realitykit-ar/SKILL.md +218 -410
  165. package/pipeline/skills/shared/external/realitykit-ar/evals/evals.json +24 -27
  166. package/pipeline/skills/shared/external/realitykit-ar/references/realitykit-patterns.md +221 -348
  167. package/pipeline/skills/shared/external/shareplay-activities/SKILL.md +222 -393
  168. package/pipeline/skills/shared/external/shareplay-activities/evals/evals.json +23 -24
  169. package/pipeline/skills/shared/external/shareplay-activities/references/shareplay-patterns.md +280 -420
  170. package/pipeline/skills/shared/external/skill-creator/template.md +7 -1
  171. package/pipeline/skills/shared/external/speech-recognition/SKILL.md +217 -421
  172. package/pipeline/skills/shared/external/speech-recognition/evals/evals.json +23 -26
  173. package/pipeline/skills/shared/external/speech-recognition/references/speechanalyzer-patterns.md +133 -125
  174. package/pipeline/skills/shared/external/storekit/SKILL.md +228 -204
  175. package/pipeline/skills/shared/external/storekit/evals/evals.json +27 -24
  176. package/pipeline/skills/shared/external/storekit/references/app-review-guidelines.md +98 -109
  177. package/pipeline/skills/shared/external/storekit/references/core-patterns.md +302 -241
  178. package/pipeline/skills/shared/external/storekit/references/storekit-advanced.md +356 -649
  179. package/pipeline/skills/shared/external/swift-api-design-guidelines/SKILL.md +274 -399
  180. package/pipeline/skills/shared/external/swift-api-design-guidelines/evals/evals.json +22 -24
  181. package/pipeline/skills/shared/external/swift-api-design-guidelines/references/argument-labels-and-parameters.md +107 -108
  182. package/pipeline/skills/shared/external/swift-api-design-guidelines/references/conventions-and-special-rules.md +93 -165
  183. package/pipeline/skills/shared/external/swift-api-design-guidelines/references/naming-and-clarity.md +99 -137
  184. package/pipeline/skills/shared/external/swift-api-design-guidelines/references/side-effects-and-mutating-pairs.md +77 -120
  185. package/pipeline/skills/shared/external/swift-architecture/SKILL.md +334 -350
  186. package/pipeline/skills/shared/external/swift-architecture/evals/evals.json +22 -22
  187. package/pipeline/skills/shared/external/swift-charts/SKILL.md +208 -394
  188. package/pipeline/skills/shared/external/swift-charts/evals/evals.json +27 -30
  189. package/pipeline/skills/shared/external/swift-charts/references/charts-patterns.md +351 -762
  190. package/pipeline/skills/shared/external/swift-codable/SKILL.md +339 -343
  191. package/pipeline/skills/shared/external/swift-codable/evals/evals.json +20 -20
  192. package/pipeline/skills/shared/external/swift-concurrency/SKILL.md +304 -351
  193. package/pipeline/skills/shared/external/swift-concurrency/evals/evals.json +27 -24
  194. package/pipeline/skills/shared/external/swift-concurrency/references/approachable-concurrency.md +65 -80
  195. package/pipeline/skills/shared/external/swift-concurrency/references/async-algorithms.md +48 -84
  196. package/pipeline/skills/shared/external/swift-concurrency/references/bridging-interop.md +134 -79
  197. package/pipeline/skills/shared/external/swift-concurrency/references/concurrency-patterns.md +145 -167
  198. package/pipeline/skills/shared/external/swift-concurrency/references/diagnostics.md +62 -50
  199. package/pipeline/skills/shared/external/swift-concurrency/references/swiftui-concurrency.md +92 -121
  200. package/pipeline/skills/shared/external/swift-concurrency/references/synchronization-primitives.md +177 -241
  201. package/pipeline/skills/shared/external/swift-formatstyle/SKILL.md +258 -234
  202. package/pipeline/skills/shared/external/swift-language/SKILL.md +342 -382
  203. package/pipeline/skills/shared/external/swift-language/evals/evals.json +24 -27
  204. package/pipeline/skills/shared/external/swift-language/references/swift-attributes-interop.md +79 -56
  205. package/pipeline/skills/shared/external/swift-language/references/swift-patterns-extended.md +297 -340
  206. package/pipeline/skills/shared/external/swift-security/SKILL.md +183 -162
  207. package/pipeline/skills/shared/external/swift-security/evals/evals.json +25 -25
  208. package/pipeline/skills/shared/external/swift-security/references/biometric-authentication.md +314 -469
  209. package/pipeline/skills/shared/external/swift-security/references/certificate-trust.md +411 -476
  210. package/pipeline/skills/shared/external/swift-security/references/common-anti-patterns.md +260 -530
  211. package/pipeline/skills/shared/external/swift-security/references/compliance-owasp-mapping.md +270 -477
  212. package/pipeline/skills/shared/external/swift-security/references/credential-storage-patterns.md +573 -571
  213. package/pipeline/skills/shared/external/swift-security/references/cryptokit-public-key.md +370 -441
  214. package/pipeline/skills/shared/external/swift-security/references/cryptokit-symmetric.md +332 -433
  215. package/pipeline/skills/shared/external/swift-security/references/keychain-access-control.md +346 -468
  216. package/pipeline/skills/shared/external/swift-security/references/keychain-fundamentals.md +375 -491
  217. package/pipeline/skills/shared/external/swift-security/references/keychain-item-classes.md +431 -432
  218. package/pipeline/skills/shared/external/swift-security/references/keychain-sharing.md +328 -425
  219. package/pipeline/skills/shared/external/swift-security/references/migration-legacy-stores.md +341 -579
  220. package/pipeline/skills/shared/external/swift-security/references/secure-enclave.md +397 -457
  221. package/pipeline/skills/shared/external/swift-security/references/testing-security-code.md +354 -614
  222. package/pipeline/skills/shared/external/swift-testing/SKILL.md +191 -175
  223. package/pipeline/skills/shared/external/swift-testing/evals/evals.json +26 -24
  224. package/pipeline/skills/shared/external/swift-testing/references/testing-advanced.md +81 -84
  225. package/pipeline/skills/shared/external/swift-testing/references/testing-patterns.md +317 -433
  226. package/pipeline/skills/shared/external/swiftdata/SKILL.md +394 -256
  227. package/pipeline/skills/shared/external/swiftdata/evals/evals.json +24 -24
  228. package/pipeline/skills/shared/external/swiftdata/references/core-data-coexistence.md +206 -402
  229. package/pipeline/skills/shared/external/swiftdata/references/indexing.md +59 -52
  230. package/pipeline/skills/shared/external/swiftdata/references/predicate-pitfalls.md +57 -33
  231. package/pipeline/skills/shared/external/swiftdata/references/swiftdata-advanced.md +354 -747
  232. package/pipeline/skills/shared/external/swiftdata/references/swiftdata-queries.md +300 -508
  233. package/pipeline/skills/shared/external/swiftlint/SKILL.md +175 -226
  234. package/pipeline/skills/shared/external/swiftlint/references/adoption-and-configuration.md +141 -208
  235. package/pipeline/skills/shared/external/swiftlint/references/custom-rules-and-analyze.md +100 -109
  236. package/pipeline/skills/shared/external/swiftlint/references/plugins-run-scripts-and-integrations.md +159 -179
  237. package/pipeline/skills/shared/external/swiftlint/references/rule-reference.md +383 -18
  238. package/pipeline/skills/shared/external/swiftlint/references/rules-suppressions-and-baselines.md +143 -229
  239. package/pipeline/skills/shared/external/swiftui-animation/SKILL.md +283 -366
  240. package/pipeline/skills/shared/external/swiftui-animation/references/animation-advanced.md +396 -608
  241. package/pipeline/skills/shared/external/swiftui-animation/references/core-animation-bridge.md +336 -385
  242. package/pipeline/skills/shared/external/swiftui-gestures/SKILL.md +239 -349
  243. package/pipeline/skills/shared/external/swiftui-gestures/references/gesture-patterns.md +228 -310
  244. package/pipeline/skills/shared/external/swiftui-layout-components/SKILL.md +260 -249
  245. package/pipeline/skills/shared/external/swiftui-layout-components/references/form.md +92 -74
  246. package/pipeline/skills/shared/external/swiftui-layout-components/references/grids.md +112 -177
  247. package/pipeline/skills/shared/external/swiftui-layout-components/references/list.md +61 -64
  248. package/pipeline/skills/shared/external/swiftui-layout-components/references/scrollview.md +94 -134
  249. package/pipeline/skills/shared/external/swiftui-liquid-glass/SKILL.md +193 -225
  250. package/pipeline/skills/shared/external/swiftui-liquid-glass/references/liquid-glass.md +173 -327
  251. package/pipeline/skills/shared/external/swiftui-navigation/SKILL.md +201 -168
  252. package/pipeline/skills/shared/external/swiftui-navigation/references/deeplinks.md +127 -150
  253. package/pipeline/skills/shared/external/swiftui-navigation/references/navigationstack.md +134 -133
  254. package/pipeline/skills/shared/external/swiftui-navigation/references/sheets.md +152 -117
  255. package/pipeline/skills/shared/external/swiftui-navigation/references/tabview.md +111 -138
  256. package/pipeline/skills/shared/external/swiftui-patterns/SKILL.md +316 -252
  257. package/pipeline/skills/shared/external/swiftui-patterns/references/architecture-patterns.md +341 -332
  258. package/pipeline/skills/shared/external/swiftui-patterns/references/deprecated-migration.md +547 -854
  259. package/pipeline/skills/shared/external/swiftui-patterns/references/design-polish.md +485 -537
  260. package/pipeline/skills/shared/external/swiftui-patterns/references/platform-and-sharing.md +417 -499
  261. package/pipeline/skills/shared/external/swiftui-performance/SKILL.md +213 -376
  262. package/pipeline/skills/shared/external/swiftui-performance/references/demystify-swiftui-performance-wwdc23.md +86 -175
  263. package/pipeline/skills/shared/external/swiftui-performance/references/optimizing-swiftui-performance-instruments.md +89 -195
  264. package/pipeline/skills/shared/external/swiftui-performance/references/understanding-hangs-in-your-app.md +95 -182
  265. package/pipeline/skills/shared/external/swiftui-performance/references/understanding-improving-swiftui-performance.md +71 -149
  266. package/pipeline/skills/shared/external/swiftui-performance/references/wwdc-session-sources.md +21 -27
  267. package/pipeline/skills/shared/external/swiftui-uikit-interop/SKILL.md +303 -295
  268. package/pipeline/skills/shared/external/swiftui-uikit-interop/references/hosting-migration.md +204 -387
  269. package/pipeline/skills/shared/external/swiftui-uikit-interop/references/representable-recipes.md +469 -683
  270. package/pipeline/skills/shared/external/swiftui-webkit/SKILL.md +140 -186
  271. package/pipeline/skills/shared/external/swiftui-webkit/references/loading-and-observation.md +75 -86
  272. package/pipeline/skills/shared/external/swiftui-webkit/references/local-content-and-custom-schemes.md +63 -60
  273. package/pipeline/skills/shared/external/swiftui-webkit/references/migration-and-fallbacks.md +69 -137
  274. package/pipeline/skills/shared/external/swiftui-webkit/references/navigation-and-javascript.md +95 -67
  275. package/pipeline/skills/shared/external/tipkit/SKILL.md +220 -335
  276. package/pipeline/skills/shared/external/tipkit/references/tipkit-patterns.md +356 -494
  277. package/pipeline/skills/shared/external/vision-framework/SKILL.md +260 -375
  278. package/pipeline/skills/shared/external/vision-framework/references/vision-requests.md +393 -515
  279. package/pipeline/skills/shared/external/vision-framework/references/visionkit-scanner.md +363 -539
  280. package/pipeline/skills/shared/external/weatherkit/SKILL.md +160 -315
  281. package/pipeline/skills/shared/external/weatherkit/references/weatherkit-patterns.md +288 -407
  282. package/pipeline/skills/shared/external/widgetkit/SKILL.md +224 -288
  283. package/pipeline/skills/shared/external/widgetkit/references/widgetkit-advanced.md +416 -719
  284. package/pipeline/skills/shared/external/NOTICE-swift-ios-skills.md +0 -39
@@ -1,196 +1,217 @@
1
1
  ---
2
2
  name: swift-security
3
- description: Use when working with iOS/macOS Keychain Services (SecItem queries, kSecClass, OSStatus errors), biometric authentication (LAContext, Face ID, Touch ID), CryptoKit (AES-GCM, ChaChaPoly, ECDSA, ECDH, HPKE, ML-KEM), Secure Enclave, secure credential storage (OAuth tokens, API keys), certificate pinning (SecTrust, SPKI), keychain sharing across apps/extensions, migrating secrets from UserDefaults or plists, or OWASP MASVS/MASTG mobile compliance on Apple platforms.
3
+ description: "Apple client security: Keychain (SecItem, kSecClass, OSStatus, iOS, macOS), Face ID/Touch ID keychain items, CryptoKit (AES-GCM, ChaChaPoly, ECDSA, ECDH, HPKE, ML-KEM), Secure Enclave, OAuth token and API key storage, SecTrust/SPKI pinning, keychain sharing, moving secrets out of UserDefaults or plists, OWASP MASVS/MASTG. Use when writing, reviewing or migrating code that stores secrets, holds keys or evaluates trust. Not for passkeys, App Attest or App Review."
4
4
  metadata:
5
- source: "dpearson2699/swift-ios-skills (PolyForm Perimeter 1.0.0)"
5
+ source: multi-agent-pipeline
6
6
  ---
7
7
 
8
8
  # Swift Security
9
9
 
10
- Use this skill for client-side Apple platform security work: Keychain Services,
11
- access control, biometric-gated secrets, CryptoKit, Secure Enclave keys,
12
- credential storage, certificate trust, keychain sharing, legacy secret
13
- migration, security testing, and OWASP mobile compliance mapping.
10
+ This skill covers the parts of an Apple-platform app that hold secrets on the
11
+ device: the keychain, biometric gates, CryptoKit primitives, Secure Enclave keys,
12
+ server trust, and the audit vocabulary around them.
14
13
 
15
- Default to iOS 17+ and Swift concurrency examples when the deployment target is
16
- unknown. Keep iOS 13+ compatibility notes when the user asks for older targets.
17
- Treat iOS 26 CryptoKit post-quantum APIs as availability-gated.
18
-
19
- ## Contents
20
-
21
- - [Workflow](#workflow)
22
- - [Reference Loading](#reference-loading)
23
- - [Security Invariants](#security-invariants)
24
- - [Sibling Boundaries](#sibling-boundaries)
25
- - [Review Checklist](#review-checklist)
26
- - [Common Mistakes](#common-mistakes)
27
- - [Output Rules](#output-rules)
28
- - [References](#references)
14
+ If nobody states a deployment target, write examples for iOS 17 and later with
15
+ Swift concurrency (actors, `async`/`await`). If the user names an older target,
16
+ keep an iOS 13 compatible path alongside (serial queue, completion handlers).
17
+ Everything CryptoKit shipped for post-quantum work in iOS 26 (SHA-3, ML-KEM,
18
+ ML-DSA, X-Wing, the Secure Enclave lattice types) sits behind an availability
19
+ check; never present it as usable on earlier systems.
29
20
 
30
21
  ## Workflow
31
22
 
32
- Classify the request before loading references.
23
+ Decide which of three jobs the request is before opening any reference file.
33
24
 
34
- 1. Review existing code: run the [Review Checklist](#review-checklist), then
35
- load [common-anti-patterns.md](references/common-anti-patterns.md) plus the
36
- domain reference for each failing area. Report severity, evidence, and the
37
- corrected pattern.
38
- 2. Improve or migrate code: identify the migration type, load the migration
39
- and target-domain references, preserve existing data, verify the new item,
40
- then remove legacy storage only after success.
41
- 3. Implement new security code: load the minimum domain references, use the
42
- provided correct patterns, include OSStatus handling and tests, then run the
43
- relevant checklist.
25
+ 1. **Review of existing code.** Walk the Review Checklist below. For every row
26
+ that fails, open [Anti-pattern catalog](references/common-anti-patterns.md)
27
+ and the domain file for that row. Report each finding with a severity, the
28
+ offending code as evidence, and the corrected pattern.
29
+ 2. **Improvement or migration.** Name the kind of migration (plaintext to
30
+ keychain, class change, accessibility change, sharing, macOS backend). Open
31
+ [Legacy migration](references/migration-legacy-stores.md) and the
32
+ file for the target domain. Keep the user's existing data readable, read the
33
+ new item back to prove the write, and remove the old copy only after that
34
+ check passes.
35
+ 3. **New implementation.** Open the fewest domain files that answer the
36
+ question and follow what they show. Handle every OSStatus, add tests, and
37
+ finish by running the matching part of the checklist.
44
38
 
45
- Do not load every reference file by default. This skill is intentionally split
46
- for progressive disclosure; load only the files needed by the user's task.
39
+ Load references on demand. Opening all of them for every question wastes
40
+ context and blurs the answer.
47
41
 
48
- ## Reference Loading
42
+ ## Which Reference to Open
49
43
 
50
- | If the task involves | Load |
44
+ | The task involves | Open |
51
45
  | --- | --- |
52
- | General keychain CRUD or OSStatus handling | [keychain-fundamentals.md](references/keychain-fundamentals.md) |
53
- | Choosing `kSecClass` or item identity | [keychain-item-classes.md](references/keychain-item-classes.md) |
54
- | Accessibility classes or `SecAccessControl` | [keychain-access-control.md](references/keychain-access-control.md) |
55
- | Face ID, Touch ID, or biometric-gated secrets | [biometric-authentication.md](references/biometric-authentication.md) |
56
- | Secure Enclave keys | [secure-enclave.md](references/secure-enclave.md) |
57
- | Hashing, HMAC, AES-GCM, ChaChaPoly, HKDF, PBKDF2 | [cryptokit-symmetric.md](references/cryptokit-symmetric.md) |
58
- | Signing, ECDH, HPKE, ML-KEM, ML-DSA | [cryptokit-public-key.md](references/cryptokit-public-key.md) |
59
- | OAuth tokens, API keys, logout, refresh rotation | [credential-storage-patterns.md](references/credential-storage-patterns.md) |
60
- | App/extension keychain sharing | [keychain-sharing.md](references/keychain-sharing.md) |
61
- | Certificate trust, SPKI pinning, mTLS | [certificate-trust.md](references/certificate-trust.md) |
62
- | UserDefaults/plist/NSCoding migration | [migration-legacy-stores.md](references/migration-legacy-stores.md) |
63
- | Unit, integration, simulator, device, or CI tests | [testing-security-code.md](references/testing-security-code.md) |
64
- | OWASP MASVS/MASTG or enterprise audit mapping | [compliance-owasp-mapping.md](references/compliance-owasp-mapping.md) |
65
- | Full security review | [common-anti-patterns.md](references/common-anti-patterns.md), then each touched domain reference |
46
+ | Keychain CRUD, return types, OSStatus codes | [Keychain basics](references/keychain-fundamentals.md) |
47
+ | Picking a `kSecClass`, primary keys, item identity | [Item classes](references/keychain-item-classes.md) |
48
+ | `kSecAttrAccessible` values, `SecAccessControl` flags | [Access control](references/keychain-access-control.md) |
49
+ | Face ID, Touch ID, secrets released by biometrics | [Biometrics](references/biometric-authentication.md) |
50
+ | Keys generated in the Secure Enclave | [Enclave keys](references/secure-enclave.md) |
51
+ | SHA-2/SHA-3, HMAC, AES-GCM, ChaChaPoly, HKDF, PBKDF2 | [Symmetric crypto](references/cryptokit-symmetric.md) |
52
+ | Signatures, ECDH, HPKE, ML-KEM, ML-DSA | [Public-key crypto](references/cryptokit-public-key.md) |
53
+ | OAuth tokens, API keys, refresh rotation, logout | [Credential lifecycles](references/credential-storage-patterns.md) |
54
+ | Sharing items between an app and its extensions or sibling apps | [Sharing](references/keychain-sharing.md) |
55
+ | `SecTrust`, SPKI pinning, client certificates (mTLS) | [Trust and pinning](references/certificate-trust.md) |
56
+ | Moving data out of UserDefaults, plists, NSCoding archives | [Legacy migration](references/migration-legacy-stores.md) |
57
+ | Unit, integration, Simulator, device and CI testing | [Testing](references/testing-security-code.md) |
58
+ | OWASP MASVS, MASTG, audit evidence | [OWASP mapping](references/compliance-owasp-mapping.md) |
59
+ | A full security review | [Anti-pattern catalog](references/common-anti-patterns.md) first, then each domain the code touches |
66
60
 
67
61
  ## Security Invariants
68
62
 
69
- Use directive language only for these security invariants and the matching
70
- anti-patterns in [common-anti-patterns.md](references/common-anti-patterns.md).
71
- For architecture choices outside this list, use advisory language.
72
-
73
- - Never store tokens, passwords, API keys, signing keys, or refresh tokens in
74
- `UserDefaults`, `Info.plist`, `.xcconfig`, source code, logs, files, or
75
- `NSCoding` archives. Use Keychain or fetch secrets at runtime.
76
- - Never ignore `OSStatus`. Every `SecItemAdd`, `SecItemCopyMatching`,
77
- `SecItemUpdate`, and `SecItemDelete` path must handle success and expected
78
- failures such as `errSecDuplicateItem`, `errSecItemNotFound`, and
79
- `errSecInteractionNotAllowed`.
80
- - Never use `LAContext.evaluatePolicy()` as the only gate for a secret. Bind
81
- protected secrets to keychain items with `SecAccessControl`, then let
82
- keychain access trigger LocalAuthentication.
83
- - Always set `kSecAttrAccessible` or `kSecAttrAccessControl` explicitly when
84
- adding keychain items.
85
- - Always use add-or-update for persistent keychain writes. Do not delete-then-add
86
- as a normal update path.
87
- - Keep `SecItem*` work off the main actor. Use an actor or serial queue for
88
- keychain access.
89
- - On macOS AppKit targets, target the data protection keychain with
90
- `kSecUseDataProtectionKeychain: true` unless deliberately working with
91
- legacy file-based keychain items.
92
- - Never reuse an AES-GCM nonce with the same key.
93
- - Never use raw ECDH `SharedSecret` bytes as a symmetric key. Derive with HKDF
94
- or X9.63 derivation.
95
- - Never use `Insecure.MD5` or `Insecure.SHA1` for security purposes.
63
+ Only these rules, and the anti-patterns that break them, are phrased as "must"
64
+ or "never". Everything else in this skill is a recommendation with trade-offs
65
+ and should be worded that way.
66
+
67
+ 1. Never place refresh tokens, signing keys, API keys, passwords or tokens in
68
+ `UserDefaults`, `Info.plist`, `.xcconfig` values, source literals, log
69
+ output, plain files or `NSCoding` archives. Use the keychain, or fetch the
70
+ value from a server at runtime.
71
+ 2. Never discard an `OSStatus`. Every path through `SecItemAdd`,
72
+ `SecItemCopyMatching`, `SecItemUpdate` and `SecItemDelete` handles success
73
+ and the expected failures `errSecDuplicateItem`, `errSecItemNotFound` and
74
+ `errSecInteractionNotAllowed`.
75
+ 3. Never let the `Bool` from `LAContext.evaluatePolicy()` be the only thing
76
+ standing between a user and a secret. Put the secret in a keychain item
77
+ protected by `SecAccessControl`; reading the item makes the system run the
78
+ biometric check.
79
+ 4. Set `kSecAttrAccessible` or `kSecAttrAccessControl` explicitly on every add.
80
+ 5. Save with add-or-update: call `SecItemAdd`, and when it returns
81
+ `errSecDuplicateItem`, call `SecItemUpdate`. Deleting and re-adding is
82
+ reserved for changing an item's access control, which `SecItemUpdate`
83
+ cannot do.
84
+ 6. `SecItem*` calls must not run on the main actor. Isolate them in an actor
85
+ (available from iOS 13) or, in completion-handler code, a private serial
86
+ queue.
87
+ 7. On macOS, pass `kSecUseDataProtectionKeychain: true` unless the code is
88
+ deliberately working with the legacy file-based keychain.
89
+ 8. Never encrypt twice with the same AES-GCM nonce under one key.
90
+ 9. Never use the bytes of an ECDH `SharedSecret` as a key. Derive one with
91
+ HKDF or X9.63 first.
92
+ 10. Never let `Insecure.SHA1` or `Insecure.MD5` protect anything; they exist
93
+ for legacy interoperability only.
94
+
95
+ ## Settled Facts
96
+
97
+ These answers apply across every reference file in this skill.
98
+
99
+ - `errSecUserCanceled` is `-128` (the user dismissed the prompt).
100
+ `errSecAuthFailed` is `-25293` (authentication failed or the protected item is
101
+ no longer usable).
102
+ - An item cannot be both synchronizable and `...ThisDeviceOnly`. Apple's
103
+ `kSecAttrSynchronizable` documentation forbids pairing it with an
104
+ accessibility value that ends in `ThisDeviceOnly`; the add is rejected with
105
+ `errSecParam` (-50) rather than quietly staying local.
106
+ - The Simulator has no Secure Enclave. Branch on
107
+ `#if targetEnvironment(simulator)` at compile time and use
108
+ `SecureEnclave.isAvailable` as the runtime check on real hardware; do not base
109
+ Simulator behaviour on what the flag reports there.
110
+ - Secure Enclave private keys that carry an access control always include
111
+ `.privateKeyUsage` in its flags, for example
112
+ `[.privateKeyUsage, .biometryCurrentSet]`.
113
+ - Any code path that shows Face ID needs `NSFaceIDUsageDescription` in
114
+ `Info.plist`. The `LAContext` header asks apps to supply it, shows its string
115
+ the first time Face ID is used, and fails evaluations with
116
+ `LAError.biometryNotAvailable` once the user denies Face ID for the app. That
117
+ applies to keychain reads that trigger Face ID as much as to `evaluatePolicy`.
118
+ - `arc4random` on Apple platforms is backed by a cryptographically secure
119
+ generator, not RC4. Its limits are a 32-bit result and the bias of `% n`. For
120
+ keys, nonces, salts and tokens, use `SecRandomCopyBytes`,
121
+ `SymmetricKey(size:)` or `SystemRandomNumberGenerator` so the size and the
122
+ failure path are explicit.
123
+ - After migrating a secret, remove the plaintext copy as soon as the keychain
124
+ read-back succeeds. A rollback window that keeps plaintext on disk defeats the
125
+ migration; keep any rollback state in the keychain instead.
96
126
 
97
127
  ## Sibling Boundaries
98
128
 
99
- This skill owns client-side storage, cryptographic primitives, hardware-backed
100
- keys, and trust evaluation. Route adjacent work deliberately:
101
-
102
- - Use `authentication` for Sign in with Apple, passkeys, OAuth UI flows,
103
- `ASAuthorizationController`, credential state, and account sign-in UX.
104
- - Use `cryptokit` for general CryptoKit API usage when storage, keychain,
105
- Secure Enclave policy, certificate trust, or compliance review is not part of
106
- the task.
107
- - Use `device-integrity` for DeviceCheck and App Attest attestation/assertion
108
- flows.
109
- - Use `ios-networking` for URLSession, request pipelines, ATS configuration,
110
- retries, caching, reachability, and transport architecture.
111
- - Use `app-store-review` for privacy manifests, ATT, App Review guideline
112
- compliance, and submission readiness.
113
-
114
- This skill may mention those areas only to identify a security handoff.
129
+ This skill owns on-device secret storage, cryptographic primitives, keys held
130
+ in hardware, and checks of server trust. Adjacent topics appear here only to
131
+ point at the right skill:
132
+
133
+ - `authentication`: passkeys, Sign in with Apple, OAuth sign-in flows,
134
+ `ASAuthorizationController`, credential state, sign-in UX, and `LAContext`
135
+ prompts and policy that do not guard a keychain item.
136
+ - `cryptokit`: CryptoKit questions with no storage, keychain, Secure Enclave,
137
+ trust or compliance angle.
138
+ - `device-integrity`: DeviceCheck and App Attest attestations and assertions.
139
+ - `ios-networking`: URLSession, request pipelines, ATS settings, retries,
140
+ caching, reachability and transport design.
141
+ - `app-store-review`: privacy manifests, ATT, App Review guidelines and
142
+ submission readiness.
115
143
 
116
144
  ## Review Checklist
117
145
 
118
- Use this checklist for code reviews and migration plans. Mark each item pass,
119
- fail, or not applicable; for each failure, cite the reference file and severity.
120
-
121
- - Secrets are not stored in `UserDefaults`, plists, source, logs, files, or
122
- archives.
123
- - Every `SecItem*` call checks `OSStatus` and handles common recoverable errors.
124
- - Biometric access to secrets is keychain-bound with `SecAccessControl`, not a
125
- standalone `Bool` from `LAContext.evaluatePolicy()`.
126
- - Keychain add dictionaries set an explicit accessibility policy.
127
- - Keychain writes use add-or-update rather than delete-then-add.
128
- - Keychain work is isolated from UI/main-actor code.
129
- - The selected `kSecClass` matches the item type and primary-key attributes.
130
- - CryptoKit code avoids nonce reuse, raw shared-secret use, weak hashes, and
131
- hardcoded keys.
132
- - Secure Enclave code checks availability, handles simulator/device differences,
133
- persists only `dataRepresentation`, and designs for device-bound keys.
134
- - App/extension sharing uses full Team ID access groups and matching
135
- entitlements on every target.
136
- - Certificate trust uses current `SecTrust` APIs, validates hostname/policy, and
137
- uses SPKI or CA pinning when pinning is required.
138
- - macOS keychain code intentionally chooses data protection or file-based
139
- keychain behavior.
140
- - Tests cover success, duplicate, missing item, locked-device, simulator/device,
141
- and migration paths where applicable.
142
- - OWASP MASVS/MASTG mappings are included when compliance is requested.
146
+ Mark each row pass, fail or n/a. A fail names the reference file and a severity.
147
+
148
+ - [ ] No secret sits in source code, `UserDefaults`, a plist, a log line, a plain file or an archive.
149
+ - [ ] Each `SecItem*` call inspects its `OSStatus` and handles the recoverable cases.
150
+ - [ ] Biometric access to a secret goes through a `SecAccessControl` keychain item, not an `evaluatePolicy()` Bool.
151
+ - [ ] Add dictionaries carry an explicit accessibility value.
152
+ - [ ] Saves are add-or-update; delete-then-add appears only for access-control changes.
153
+ - [ ] Keychain calls run away from the UI and the main actor.
154
+ - [ ] The `kSecClass` fits the item and its primary-key attributes are all set.
155
+ - [ ] CryptoKit use avoids nonce reuse, raw shared secrets, weak hashes and embedded keys.
156
+ - [ ] Secure Enclave code checks availability, separates Simulator from device, stores only `dataRepresentation`, and assumes keys never leave the device.
157
+ - [ ] App and extension sharing uses Team ID prefixed access groups with matching entitlements on every target.
158
+ - [ ] Trust evaluation uses current `SecTrust` APIs, checks the host name and policy, and pins SPKI or a CA when pinning is required.
159
+ - [ ] On macOS, the choice between the file-based keychain and the data protection keychain is deliberate.
160
+ - [ ] Tests exercise the happy path, a duplicate add, an absent item, a locked device, Simulator against hardware, and migration where it applies.
161
+ - [ ] A MASVS/MASTG mapping is included when compliance was asked for.
143
162
 
144
163
  ## Common Mistakes
145
164
 
146
- - Generating partial keychain examples without duplicate handling or
147
- `errSecItemNotFound` handling.
148
- - Adding biometric UI but leaving the secret readable without keychain access
149
- control.
150
- - Choosing `kSecAttrAccessibleWhenUnlocked` implicitly by omitting the attribute.
151
- - Using `kSecAttrAccessibleAlways` or
152
- `kSecAttrAccessibleAlwaysThisDeviceOnly`, both deprecated.
153
- - Mixing `kSecAttrAccessible` and `kSecAttrAccessControl` on the same add query.
154
- - Treating Secure Enclave keys as importable, exportable, syncable, or suitable
155
- for symmetric encryption.
156
- - Claiming SHA-3, ML-KEM, ML-DSA, or X-Wing CryptoKit APIs are available before
157
- iOS 26.
158
- - Treating HPKE as available before iOS 17.
159
- - Implementing certificate pinning by hashing only raw key bytes instead of the
160
- correct SPKI representation.
161
- - Expanding this skill into account-login, networking, App Attest, or App Store
162
- review guidance instead of handing off to sibling skills.
165
+ - Keychain snippets that stop at `SecItemAdd` with no duplicate branch or no
166
+ `errSecItemNotFound` branch.
167
+ - A Face ID prompt bolted onto the UI while the secret itself remains readable
168
+ without any keychain access control.
169
+ - Leaving out `kSecAttrAccessible`, which silently means
170
+ `kSecAttrAccessibleWhenUnlocked`.
171
+ - Using `kSecAttrAccessibleAlways` or `kSecAttrAccessibleAlwaysThisDeviceOnly`;
172
+ both are deprecated.
173
+ - One add dictionary that carries both `kSecAttrAccessControl` and
174
+ `kSecAttrAccessible`.
175
+ - Expecting to import, export or sync an enclave key, or asking the enclave to
176
+ perform symmetric encryption.
177
+ - Offering the CryptoKit ML-KEM, ML-DSA, X-Wing or SHA-3 types on systems older
178
+ than iOS 26.
179
+ - Offering HPKE on systems older than iOS 17.
180
+ - Computing a pin over bare public-key bytes instead of the DER-encoded
181
+ SubjectPublicKeyInfo.
182
+ - Wandering into sign-in flows, networking stacks, App Attest or App Review
183
+ instead of handing those parts to the sibling skill.
163
184
 
164
185
  ## Output Rules
165
186
 
166
- - For security findings, state severity: CRITICAL for exploitable secret or
167
- cryptography failures, HIGH for silent security boundary/data-loss issues, and
168
- MEDIUM for brittle or incomplete hardening.
169
- - Include wrong and corrected code examples for implementation reviews when a
170
- concrete anti-pattern is present.
171
- - Include minimum iOS/macOS availability when recommending versioned APIs.
172
- - Cite the reference file that supports each substantive security pattern.
173
- - For keychain code, include `OSStatus` handling and explicit accessibility in
174
- examples.
175
- - For implementation or migration answers, end with `## Reference Files` and
176
- list the loaded references with a one-line purpose.
177
- - Do not invent WWDC session numbers or source citations. If a claim is not
178
- present in the loaded references or official Apple documentation, say it needs
179
- verification.
187
+ - Severity: **CRITICAL** is an exploitable secret exposure or broken crypto;
188
+ **HIGH** is a silent break in a security boundary or a data-loss path;
189
+ **MEDIUM** is hardening that is brittle or incomplete.
190
+ - When reviewing code with a concrete anti-pattern, show the wrong code and the
191
+ corrected code.
192
+ - State the minimum iOS and macOS version whenever you recommend an API that is
193
+ versioned.
194
+ - Name the reference file that backs each substantive security pattern.
195
+ - Keychain samples always show `OSStatus` handling and an explicit
196
+ accessibility value.
197
+ - Close implementation and migration answers with a `## Reference Files`
198
+ section: each reference you loaded plus one line on why.
199
+ - Do not make up WWDC session numbers or citations. When a claim has no source
200
+ at hand, say it needs verification.
180
201
 
181
202
  ## References
182
203
 
183
- - [keychain-fundamentals.md](references/keychain-fundamentals.md) - SecItem CRUD, OSStatus handling, add-or-update, macOS data protection keychain.
184
- - [keychain-item-classes.md](references/keychain-item-classes.md) - `kSecClass` selection, primary keys, certificates, identities.
185
- - [keychain-access-control.md](references/keychain-access-control.md) - Accessibility constants, `SecAccessControl`, background access, data protection.
186
- - [biometric-authentication.md](references/biometric-authentication.md) - Keychain-bound biometrics, `LAContext`, enrollment-change handling.
187
- - [secure-enclave.md](references/secure-enclave.md) - Secure Enclave constraints, persistence, biometric keys, iOS 26 PQ APIs.
188
- - [cryptokit-symmetric.md](references/cryptokit-symmetric.md) - SHA, HMAC, AES-GCM, ChaChaPoly, HKDF, PBKDF2.
189
- - [cryptokit-public-key.md](references/cryptokit-public-key.md) - Signing, key agreement, HPKE, ML-KEM, ML-DSA, key formats.
190
- - [credential-storage-patterns.md](references/credential-storage-patterns.md) - OAuth tokens, API keys, rotation, logout cleanup.
191
- - [keychain-sharing.md](references/keychain-sharing.md) - Access groups, extensions, iCloud sync, macOS access groups.
192
- - [certificate-trust.md](references/certificate-trust.md) - SecTrust, SPKI/CA pinning, `NSPinnedDomains`, client certificates.
193
- - [migration-legacy-stores.md](references/migration-legacy-stores.md) - UserDefaults/plist/NSCoding migration and cleanup.
194
- - [common-anti-patterns.md](references/common-anti-patterns.md) - Review backbone for insecure generated code.
195
- - [testing-security-code.md](references/testing-security-code.md) - Protocol mocks, real keychain tests, CI/device split.
196
- - [compliance-owasp-mapping.md](references/compliance-owasp-mapping.md) - OWASP Mobile Top 10, MASVS, MASTG evidence mapping.
204
+ - [Keychain basics](references/keychain-fundamentals.md): the four SecItem calls, return types, OSStatus handling, actor wrapper, macOS backends.
205
+ - [Item classes](references/keychain-item-classes.md): the five item classes, their primary keys, keys, certificates and identities.
206
+ - [Access control](references/keychain-access-control.md): accessibility constants, `SecAccessControl` flags, background access, file protection.
207
+ - [Biometrics](references/biometric-authentication.md): keychain-bound biometrics, `LAContext`, enrollment changes.
208
+ - [Enclave keys](references/secure-enclave.md): enclave limits, CryptoKit `SecureEnclave`, key persistence, iOS 26 post-quantum types.
209
+ - [Symmetric crypto](references/cryptokit-symmetric.md): hashing, HMAC, AES-GCM, ChaChaPoly, HKDF, PBKDF2.
210
+ - [Public-key crypto](references/cryptokit-public-key.md): ECDSA, ECDH, HPKE, ML-KEM, ML-DSA, key formats, moving off RSA.
211
+ - [Credential lifecycles](references/credential-storage-patterns.md): OAuth tokens, API keys, refresh rotation, logout cleanup.
212
+ - [Sharing](references/keychain-sharing.md): access groups, entitlements, extensions, iCloud Keychain, macOS groups.
213
+ - [Trust and pinning](references/certificate-trust.md): `SecTrust`, SPKI and CA pinning, `NSPinnedDomains`, client certificates.
214
+ - [Legacy migration](references/migration-legacy-stores.md): moving secrets out of UserDefaults, plists and archives, then cleaning up.
215
+ - [Anti-pattern catalog](references/common-anti-patterns.md): the catalog of insecure patterns that drives a review.
216
+ - [Testing](references/testing-security-code.md): protocol mocks, real keychain tests, the CI and device split.
217
+ - [OWASP mapping](references/compliance-owasp-mapping.md): OWASP Mobile Top 10, MASVS and MASTG evidence.
@@ -4,44 +4,44 @@
4
4
  {
5
5
  "id": 0,
6
6
  "name": "keychain-token-review",
7
- "prompt": "Review this iOS token storage helper before we ship it. It saves an OAuth refresh token with `UserDefaults.standard.set(refreshToken, forKey: \"refresh\")`, writes access tokens with `SecItemAdd(query as CFDictionary, nil)` but ignores the returned OSStatus, omits `kSecAttrAccessible`, and calls `SecItemDelete` before every save to avoid duplicates. What is wrong, what severity would you assign, and what should the corrected Keychain pattern require?",
8
- "expected_output": "A security review that flags plaintext token storage, ignored OSStatus, missing accessibility, and delete-then-add as findings; assigns severity; and requires Keychain add-or-update with explicit accessibility and recoverable error handling.",
7
+ "prompt": "Review this helper from our fitness app. `SessionVault.save(refresh:)` keeps a fallback copy via `UserDefaults.standard.set(token, forKey: \"rt\")`, then calls `SecItemDelete` on the same service and account followed by `SecItemAdd` with class, service, account and value data. The return value of `SecItemAdd` is ignored and no accessibility attribute is passed. Tell us what is wrong and how to fix it.",
8
+ "expected_output": "Flags the UserDefaults copy of the refresh token as CRITICAL or HIGH and says it must be removed. Points out the ignored OSStatus and shows handling for errSecDuplicateItem, errSecItemNotFound and errSecInteractionNotAllowed. Adds an explicit kSecAttrAccessible value (or a SecAccessControl) to the add dictionary. Replaces delete-then-add with add, then SecItemUpdate when the add reports a duplicate. Shows wrong and corrected code and names the reference files used.",
9
9
  "files": [],
10
- "assertions": [
11
- "Flags the refresh token in UserDefaults as a critical or high-severity insecure secret storage finding.",
12
- "Requires checking OSStatus for SecItem calls and specifically handling errSecDuplicateItem, errSecItemNotFound, and errSecInteractionNotAllowed where relevant.",
13
- "Requires an explicit kSecAttrAccessible or SecAccessControl policy for added items.",
14
- "Rejects delete-then-add as the normal update strategy and recommends add-or-update with SecItemUpdate on errSecDuplicateItem.",
15
- "Cites or names the relevant swift-security reference files for Keychain fundamentals, credential storage, access control, or common anti-patterns."
10
+ "expectations": [
11
+ "Rates the refresh token stored in UserDefaults as critical or high severity",
12
+ "Adds OSStatus checks that cover errSecDuplicateItem, errSecItemNotFound and errSecInteractionNotAllowed",
13
+ "Sets kSecAttrAccessible explicitly, or uses a SecAccessControl, on the add",
14
+ "Rejects the delete-then-add save and calls SecItemUpdate when SecItemAdd returns a duplicate",
15
+ "Cites the reference files that support the fixes"
16
16
  ]
17
17
  },
18
18
  {
19
19
  "id": 1,
20
20
  "name": "biometric-secret-boundary",
21
- "prompt": "A banking app wants Face ID before showing an account number. The current plan is to call `LAContext.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: ...)`, check the returned Bool, then read the account number from UserDefaults. They also forgot `NSFaceIDUsageDescription`. Write the correction plan and include the important iOS API constraints.",
22
- "expected_output": "A correction plan that rejects the standalone LAContext Bool gate, moves the secret into a Keychain item protected by SecAccessControl, mentions Face ID usage description, handles enrollment changes, and states availability constraints for the biometric APIs.",
21
+ "prompt": "Our banking app shows the full card number after `LAContext().evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason:)` returns true. The number itself lives in UserDefaults and Info.plist has no Face ID entry. Is this acceptable, and what should we change?",
22
+ "expected_output": "Says a Bool from evaluatePolicy is not a security boundary and can be forced true at runtime. Moves the card number into the keychain, guarded by a SecAccessControl using .biometryCurrentSet (or .userPresence where passcode fallback is wanted) so the read itself triggers the prompt. Adds NSFaceIDUsageDescription to Info.plist. Explains that .biometryCurrentSet makes the item unreadable after an enrollment change, how evaluatedPolicyDomainState detects that, and the recovery path. Cites biometric-authentication.md and keychain-access-control.md.",
23
23
  "files": [],
24
- "assertions": [
25
- "States that LAContext.evaluatePolicy alone must not release or protect the stored secret.",
26
- "Requires storing the account number or token in Keychain behind SecAccessControl with an appropriate flag such as .biometryCurrentSet or .userPresence.",
27
- "Mentions NSFaceIDUsageDescription as required for Face ID use.",
28
- "Explains the enrollment-change effect of .biometryCurrentSet or evaluatedPolicyDomainState and the need for recovery/re-enrollment handling.",
29
- "Cites or names biometric-authentication and keychain-access-control references."
24
+ "expectations": [
25
+ "Rejects the evaluatePolicy Bool as the only gate",
26
+ "Stores the secret in the keychain behind SecAccessControl using .biometryCurrentSet or .userPresence",
27
+ "Mentions adding NSFaceIDUsageDescription to Info.plist",
28
+ "Says what an enrollment change does to a .biometryCurrentSet item, covers detection through evaluatedPolicyDomainState, and a recovery flow",
29
+ "Cites biometric-authentication.md and keychain-access-control.md"
30
30
  ]
31
31
  },
32
32
  {
33
33
  "id": 2,
34
34
  "name": "security-sibling-boundary",
35
- "prompt": "A team asks for one security checklist covering Sign in with Apple, passkey server verification, App Attest assertions, URLSession quantum-secure TLS, custom end-to-end document encryption on iOS 26, Keychain refresh-token storage, Secure Enclave keys, and App Store privacy manifests. Give a concise scope review for what swift-security should answer directly and what should be handed to sibling skills.",
36
- "expected_output": "A boundary-aware scope review that keeps Keychain, CryptoKit, Secure Enclave, credential storage, and certificate trust in swift-security; routes auth UI/server passkeys, App Attest, URLSession/TLS transport, and App Store privacy manifests to sibling skills; and names iOS 26 CryptoKit availability for custom quantum-secure workflows.",
35
+ "prompt": "Give us a security checklist for our next release. It covers: refresh-token storage in the keychain, the access policy for a Secure Enclave signing key, pinning our API certificate, end-to-end encrypting chat messages with CryptoKit, adding Sign in with Apple and passkeys, verifying OAuth tokens on the relying party, App Attest, URLSession TLS settings, and our privacy manifest. We also want to try ML-KEM.",
36
+ "expected_output": "Treats four items as in scope here: keychain refresh-token storage, the access policy of the enclave key, certificate trust, and CryptoKit encryption on the client. Hands passkeys, Sign in with Apple, OAuth and relying-party verification to authentication, App Attest and DeviceCheck to device-integrity, URLSession and TLS configuration to ios-networking (the custom CryptoKit end-to-end layer stays here), and the privacy manifest to app-store-review. Notes that X-Wing, ML-DSA, ML-KEM, SHA-3 and the Secure Enclave post-quantum types need iOS 26.",
37
37
  "files": [],
38
- "assertions": [
39
- "Keeps Keychain refresh-token storage, Secure Enclave key policy, certificate trust, and client-side CryptoKit guidance in swift-security scope.",
40
- "Routes Sign in with Apple, passkey registration/assertion UI, OAuth account flows, and passkey relying-party verification to authentication rather than expanding swift-security.",
41
- "Routes App Attest and DeviceCheck assertions to device-integrity.",
42
- "Routes URLSession transport architecture or TLS configuration to ios-networking while noting swift-security can discuss custom CryptoKit end-to-end encryption.",
43
- "Routes App Store privacy manifests and submission compliance to app-store-review.",
44
- "Mentions iOS 26 availability for ML-KEM, ML-DSA, X-Wing, SHA-3, or SecureEnclave post-quantum APIs when discussing custom document encryption."
38
+ "expectations": [
39
+ "Treats keychain token storage, the enclave key policy, certificate trust and client-side CryptoKit as in scope",
40
+ "Routes passkeys, Sign in with Apple, OAuth and relying-party verification to authentication",
41
+ "Routes App Attest and DeviceCheck to device-integrity",
42
+ "Sends URLSession and TLS settings to ios-networking and keeps the app's own end-to-end CryptoKit layer here",
43
+ "Routes privacy manifests to app-store-review",
44
+ "Says X-Wing, ML-DSA, ML-KEM, SHA-3 and the enclave post-quantum APIs require iOS 26"
45
45
  ]
46
46
  }
47
47
  ]