@mmerterden/multi-agent-pipeline 20.6.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 (326) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/LICENSE +0 -10
  3. package/docs/facts.json +1 -1
  4. package/manifest.json +328 -329
  5. package/package.json +2 -2
  6. package/pipeline/multi-agent-refs/features/design-conformance.md +62 -64
  7. package/pipeline/scripts/_notices.mjs +12 -1
  8. package/pipeline/scripts/gen-skills-index.mjs +1 -1
  9. package/pipeline/skills/.skill-manifest.json +106 -106
  10. package/pipeline/skills/shared/README.md +71 -71
  11. package/pipeline/skills/shared/external/agent-introspection-debugging/SKILL.md +1 -0
  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/android-architecture/SKILL.md +2 -0
  16. package/pipeline/skills/shared/external/android-performance/SKILL.md +2 -0
  17. package/pipeline/skills/shared/external/android-security/SKILL.md +2 -0
  18. package/pipeline/skills/shared/external/app-clips/SKILL.md +260 -160
  19. package/pipeline/skills/shared/external/app-clips/evals/evals.json +27 -27
  20. package/pipeline/skills/shared/external/app-clips/references/data-handoff-notifications-location.md +150 -83
  21. package/pipeline/skills/shared/external/app-clips/references/routing-and-experiences.md +135 -83
  22. package/pipeline/skills/shared/external/app-clips/references/size-capabilities-and-promotion.md +143 -85
  23. package/pipeline/skills/shared/external/app-intents/SKILL.md +302 -304
  24. package/pipeline/skills/shared/external/app-intents/evals/evals.json +21 -21
  25. package/pipeline/skills/shared/external/app-intents/references/appintents-advanced.md +594 -894
  26. package/pipeline/skills/shared/external/app-store-optimization/SKILL.md +339 -277
  27. package/pipeline/skills/shared/external/app-store-optimization/evals/evals.json +27 -23
  28. package/pipeline/skills/shared/external/app-store-optimization/references/keyword-research-methodology.md +105 -122
  29. package/pipeline/skills/shared/external/app-store-optimization/references/product-page-variants.md +143 -166
  30. package/pipeline/skills/shared/external/app-store-review/SKILL.md +307 -326
  31. package/pipeline/skills/shared/external/app-store-review/evals/evals.json +21 -21
  32. package/pipeline/skills/shared/external/app-store-review/references/privacy-manifest.md +105 -67
  33. package/pipeline/skills/shared/external/app-store-review/references/review-checklists.md +114 -101
  34. package/pipeline/skills/shared/external/apple-on-device-ai/SKILL.md +333 -360
  35. package/pipeline/skills/shared/external/apple-on-device-ai/evals/evals.json +24 -27
  36. package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-conversion.md +215 -322
  37. package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-optimization.md +161 -256
  38. package/pipeline/skills/shared/external/apple-on-device-ai/references/foundation-models.md +277 -387
  39. package/pipeline/skills/shared/external/apple-on-device-ai/references/mlx-swift.md +196 -210
  40. package/pipeline/skills/shared/external/authentication/SKILL.md +265 -381
  41. package/pipeline/skills/shared/external/authentication/evals/evals.json +25 -25
  42. package/pipeline/skills/shared/external/authentication/references/keychain-biometric.md +133 -178
  43. package/pipeline/skills/shared/external/authentication/references/passkeys.md +111 -147
  44. package/pipeline/skills/shared/external/avkit/SKILL.md +267 -364
  45. package/pipeline/skills/shared/external/avkit/evals/evals.json +26 -26
  46. package/pipeline/skills/shared/external/avkit/references/avkit-patterns.md +375 -493
  47. package/pipeline/skills/shared/external/background-processing/SKILL.md +270 -382
  48. package/pipeline/skills/shared/external/background-processing/evals/evals.json +22 -22
  49. package/pipeline/skills/shared/external/background-processing/references/background-task-patterns.md +169 -317
  50. package/pipeline/skills/shared/external/backlog/BACKLOG.md +1 -1
  51. package/pipeline/skills/shared/external/backlog/SKILL.md +56 -33
  52. package/pipeline/skills/shared/external/callkit-voip/SKILL.md +290 -371
  53. package/pipeline/skills/shared/external/callkit-voip/evals/evals.json +24 -24
  54. package/pipeline/skills/shared/external/callkit-voip/references/callkit-patterns.md +175 -343
  55. package/pipeline/skills/shared/external/ci-cd-pipelines/SKILL.md +1 -0
  56. package/pipeline/skills/shared/external/cloudkit-sync/SKILL.md +292 -381
  57. package/pipeline/skills/shared/external/cloudkit-sync/evals/evals.json +33 -30
  58. package/pipeline/skills/shared/external/cloudkit-sync/references/cloudkit-patterns.md +227 -355
  59. package/pipeline/skills/shared/external/compose-components/SKILL.md +2 -0
  60. package/pipeline/skills/shared/external/compose-navigation/SKILL.md +3 -2
  61. package/pipeline/skills/shared/external/compose-testing/SKILL.md +2 -0
  62. package/pipeline/skills/shared/external/contacts-framework/SKILL.md +197 -346
  63. package/pipeline/skills/shared/external/contacts-framework/evals/evals.json +19 -21
  64. package/pipeline/skills/shared/external/contacts-framework/references/contacts-patterns.md +169 -308
  65. package/pipeline/skills/shared/external/core-bluetooth/SKILL.md +226 -376
  66. package/pipeline/skills/shared/external/core-bluetooth/evals/evals.json +25 -22
  67. package/pipeline/skills/shared/external/core-bluetooth/references/ble-patterns.md +257 -337
  68. package/pipeline/skills/shared/external/core-data/SKILL.md +292 -368
  69. package/pipeline/skills/shared/external/core-data/evals/evals.json +30 -27
  70. package/pipeline/skills/shared/external/core-motion/SKILL.md +235 -324
  71. package/pipeline/skills/shared/external/core-motion/evals/evals.json +31 -27
  72. package/pipeline/skills/shared/external/core-motion/references/motion-patterns.md +210 -310
  73. package/pipeline/skills/shared/external/core-nfc/SKILL.md +292 -366
  74. package/pipeline/skills/shared/external/core-nfc/evals/evals.json +22 -24
  75. package/pipeline/skills/shared/external/core-nfc/references/nfc-patterns.md +233 -329
  76. package/pipeline/skills/shared/external/coreml/SKILL.md +323 -367
  77. package/pipeline/skills/shared/external/coreml/evals/evals.json +24 -21
  78. package/pipeline/skills/shared/external/coreml/references/coreml-swift-integration.md +562 -565
  79. package/pipeline/skills/shared/external/council/SKILL.md +1 -0
  80. package/pipeline/skills/shared/external/cryptokit/SKILL.md +253 -394
  81. package/pipeline/skills/shared/external/cryptokit/evals/evals.json +20 -18
  82. package/pipeline/skills/shared/external/cryptokit/references/cryptokit-patterns.md +299 -488
  83. package/pipeline/skills/shared/external/css-modern/SKILL.md +1 -0
  84. package/pipeline/skills/shared/external/database-patterns/SKILL.md +1 -0
  85. package/pipeline/skills/shared/external/debugging-instruments/SKILL.md +270 -323
  86. package/pipeline/skills/shared/external/debugging-instruments/evals/evals.json +27 -30
  87. package/pipeline/skills/shared/external/debugging-instruments/references/instruments-guide.md +167 -315
  88. package/pipeline/skills/shared/external/debugging-instruments/references/lldb-patterns.md +140 -193
  89. package/pipeline/skills/shared/external/device-integrity/SKILL.md +230 -353
  90. package/pipeline/skills/shared/external/device-integrity/evals/evals.json +25 -21
  91. package/pipeline/skills/shared/external/device-integrity/references/device-integrity-patterns.md +159 -197
  92. package/pipeline/skills/shared/external/energykit/SKILL.md +225 -392
  93. package/pipeline/skills/shared/external/energykit/evals/evals.json +29 -28
  94. package/pipeline/skills/shared/external/energykit/references/energykit-patterns.md +174 -470
  95. package/pipeline/skills/shared/external/eventkit-calendar/SKILL.md +261 -383
  96. package/pipeline/skills/shared/external/eventkit-calendar/evals/evals.json +25 -22
  97. package/pipeline/skills/shared/external/eventkit-calendar/references/eventkit-patterns.md +165 -268
  98. package/pipeline/skills/shared/external/evidence-github/SKILL.md +2 -0
  99. package/pipeline/skills/shared/external/evidence-registry/SKILL.md +2 -0
  100. package/pipeline/skills/shared/external/gradle-kotlin-dsl/SKILL.md +2 -0
  101. package/pipeline/skills/shared/external/healthkit/SKILL.md +252 -303
  102. package/pipeline/skills/shared/external/healthkit/evals/evals.json +24 -23
  103. package/pipeline/skills/shared/external/healthkit/references/healthkit-patterns.md +369 -523
  104. package/pipeline/skills/shared/external/homekit-matter/SKILL.md +233 -348
  105. package/pipeline/skills/shared/external/homekit-matter/evals/evals.json +27 -22
  106. package/pipeline/skills/shared/external/homekit-matter/references/matter-commissioning.md +199 -305
  107. package/pipeline/skills/shared/external/html-semantic/SKILL.md +1 -0
  108. package/pipeline/skills/shared/external/humanizer/SKILL.md +1 -0
  109. package/pipeline/skills/shared/external/ios-accessibility/SKILL.md +368 -340
  110. package/pipeline/skills/shared/external/ios-accessibility/evals/evals.json +28 -27
  111. package/pipeline/skills/shared/external/ios-accessibility/references/a11y-patterns.md +314 -260
  112. package/pipeline/skills/shared/external/ios-accessibility/references/media-accessibility.md +97 -67
  113. package/pipeline/skills/shared/external/ios-accessibility/references/nutrition-labels.md +165 -101
  114. package/pipeline/skills/shared/external/ios-coding-standard/SKILL.md +1 -0
  115. package/pipeline/skills/shared/external/ios-localization/SKILL.md +258 -371
  116. package/pipeline/skills/shared/external/ios-localization/evals/evals.json +23 -23
  117. package/pipeline/skills/shared/external/ios-localization/references/formatstyle-locale.md +283 -491
  118. package/pipeline/skills/shared/external/ios-localization/references/string-catalogs.md +313 -440
  119. package/pipeline/skills/shared/external/ios-module-structure/SKILL.md +1 -0
  120. package/pipeline/skills/shared/external/ios-networking/SKILL.md +265 -341
  121. package/pipeline/skills/shared/external/ios-networking/evals/evals.json +24 -24
  122. package/pipeline/skills/shared/external/ios-networking/references/background-websocket.md +425 -652
  123. package/pipeline/skills/shared/external/ios-networking/references/file-storage-patterns.md +143 -285
  124. package/pipeline/skills/shared/external/ios-networking/references/lightweight-clients.md +93 -53
  125. package/pipeline/skills/shared/external/ios-networking/references/network-framework.md +231 -456
  126. package/pipeline/skills/shared/external/ios-networking/references/urlsession-patterns.md +517 -784
  127. package/pipeline/skills/shared/external/ios-security/SKILL.md +2 -0
  128. package/pipeline/skills/shared/external/ios-simulator/SKILL.md +265 -393
  129. package/pipeline/skills/shared/external/ios-simulator/evals/evals.json +21 -21
  130. package/pipeline/skills/shared/external/ios-simulator/references/simctl-commands.md +177 -270
  131. package/pipeline/skills/shared/external/live-activities/SKILL.md +318 -360
  132. package/pipeline/skills/shared/external/live-activities/evals/evals.json +21 -21
  133. package/pipeline/skills/shared/external/live-activities/references/activitykit-patterns.md +478 -710
  134. package/pipeline/skills/shared/external/localization-reuse-map/SKILL.md +91 -283
  135. package/pipeline/skills/shared/external/localization-reuse-map/reference/format-and-output.md +119 -151
  136. package/pipeline/skills/shared/external/localization-reuse-map/reference/publish-and-snapshot.md +60 -90
  137. package/pipeline/skills/shared/external/localization-reuse-map/reference/sources-and-recipes.md +119 -156
  138. package/pipeline/skills/shared/external/localization-reuse-map/scripts/build-artifact.py +726 -787
  139. package/pipeline/skills/shared/external/localization-reuse-map/scripts/build-spreadsheet.py +253 -288
  140. package/pipeline/skills/shared/external/localization-reuse-map/scripts/fetch-annotations.py +243 -304
  141. package/pipeline/skills/shared/external/localization-reuse-map/scripts/fetch-legacy-labels.py +88 -104
  142. package/pipeline/skills/shared/external/localization-reuse-map/scripts/publish-confluence.py +181 -235
  143. package/pipeline/skills/shared/external/localization-reuse-map/scripts/render-key-shots.py +198 -263
  144. package/pipeline/skills/shared/external/localization-reuse-map/scripts/render-overlay.py +461 -466
  145. package/pipeline/skills/shared/external/localization-reuse-map/scripts/resolve-legacy-values.py +145 -151
  146. package/pipeline/skills/shared/external/localization-reuse-map/scripts/resolve-new-values.py +123 -141
  147. package/pipeline/skills/shared/external/localization-reuse-map/scripts/scan-screen-keys.py +146 -157
  148. package/pipeline/skills/shared/external/localization-reuse-map/scripts/snapshot-resources.sh +22 -19
  149. package/pipeline/skills/shared/external/localization-reuse-map/scripts/verify-map.py +156 -140
  150. package/pipeline/skills/shared/external/mapkit-location/SKILL.md +295 -267
  151. package/pipeline/skills/shared/external/mapkit-location/evals/evals.json +28 -24
  152. package/pipeline/skills/shared/external/mapkit-location/references/mapkit-corelocation-patterns.md +378 -532
  153. package/pipeline/skills/shared/external/mapkit-location/references/mapkit-patterns.md +397 -499
  154. package/pipeline/skills/shared/external/metrickit-diagnostics/SKILL.md +165 -348
  155. package/pipeline/skills/shared/external/metrickit-diagnostics/evals/evals.json +26 -23
  156. package/pipeline/skills/shared/external/metrickit-diagnostics/references/metrickit-patterns.md +123 -130
  157. package/pipeline/skills/shared/external/musickit-audio/SKILL.md +189 -315
  158. package/pipeline/skills/shared/external/musickit-audio/evals/evals.json +22 -21
  159. package/pipeline/skills/shared/external/musickit-audio/references/musickit-patterns.md +181 -270
  160. package/pipeline/skills/shared/external/natural-language/SKILL.md +188 -340
  161. package/pipeline/skills/shared/external/natural-language/evals/evals.json +21 -21
  162. package/pipeline/skills/shared/external/natural-language/references/translation-patterns.md +171 -225
  163. package/pipeline/skills/shared/external/nextjs-app-router/SKILL.md +1 -0
  164. package/pipeline/skills/shared/external/passkit-wallet/SKILL.md +258 -392
  165. package/pipeline/skills/shared/external/passkit-wallet/evals/evals.json +30 -29
  166. package/pipeline/skills/shared/external/passkit-wallet/references/wallet-passes.md +164 -231
  167. package/pipeline/skills/shared/external/pdfkit/SKILL.md +312 -344
  168. package/pipeline/skills/shared/external/pdfkit/evals/evals.json +19 -19
  169. package/pipeline/skills/shared/external/pdfkit/references/pdfkit-patterns.md +413 -624
  170. package/pipeline/skills/shared/external/pencilkit-drawing/SKILL.md +242 -358
  171. package/pipeline/skills/shared/external/pencilkit-drawing/evals/evals.json +25 -21
  172. package/pipeline/skills/shared/external/pencilkit-drawing/references/pencilkit-patterns.md +161 -226
  173. package/pipeline/skills/shared/external/permissionkit/SKILL.md +282 -400
  174. package/pipeline/skills/shared/external/permissionkit/evals/evals.json +27 -30
  175. package/pipeline/skills/shared/external/permissionkit/references/permissionkit-patterns.md +237 -350
  176. package/pipeline/skills/shared/external/photos-camera-media/SKILL.md +276 -325
  177. package/pipeline/skills/shared/external/photos-camera-media/references/av-playback.md +299 -545
  178. package/pipeline/skills/shared/external/photos-camera-media/references/camera-capture.md +344 -588
  179. package/pipeline/skills/shared/external/photos-camera-media/references/image-loading-caching.md +316 -660
  180. package/pipeline/skills/shared/external/photos-camera-media/references/photokit-patterns.md +270 -416
  181. package/pipeline/skills/shared/external/play-store-review/SKILL.md +2 -0
  182. package/pipeline/skills/shared/external/push-notifications/SKILL.md +312 -340
  183. package/pipeline/skills/shared/external/push-notifications/evals/evals.json +27 -26
  184. package/pipeline/skills/shared/external/push-notifications/references/notification-patterns.md +328 -485
  185. package/pipeline/skills/shared/external/push-notifications/references/rich-notifications.md +327 -560
  186. package/pipeline/skills/shared/external/python-patterns/SKILL.md +1 -0
  187. package/pipeline/skills/shared/external/react-best-practices/SKILL.md +1 -0
  188. package/pipeline/skills/shared/external/realitykit-ar/SKILL.md +218 -410
  189. package/pipeline/skills/shared/external/realitykit-ar/evals/evals.json +24 -27
  190. package/pipeline/skills/shared/external/realitykit-ar/references/realitykit-patterns.md +221 -348
  191. package/pipeline/skills/shared/external/rest-api-design/SKILL.md +1 -0
  192. package/pipeline/skills/shared/external/retrofit-networking/SKILL.md +2 -0
  193. package/pipeline/skills/shared/external/room-database/SKILL.md +2 -0
  194. package/pipeline/skills/shared/external/search-first/SKILL.md +1 -0
  195. package/pipeline/skills/shared/external/shareplay-activities/SKILL.md +222 -393
  196. package/pipeline/skills/shared/external/shareplay-activities/evals/evals.json +23 -24
  197. package/pipeline/skills/shared/external/shareplay-activities/references/shareplay-patterns.md +280 -420
  198. package/pipeline/skills/shared/external/signal-community/SKILL.md +2 -0
  199. package/pipeline/skills/shared/external/skill-creator/SKILL.md +80 -41
  200. package/pipeline/skills/shared/external/skill-creator/audit.md +63 -59
  201. package/pipeline/skills/shared/external/skill-creator/checklist.md +28 -20
  202. package/pipeline/skills/shared/external/skill-creator/examples.md +40 -40
  203. package/pipeline/skills/shared/external/skill-creator/label-check.md +48 -36
  204. package/pipeline/skills/shared/external/skill-creator/scripts/audit-panel.js +91 -100
  205. package/pipeline/skills/shared/external/skill-creator/template.md +51 -39
  206. package/pipeline/skills/shared/external/speech-recognition/SKILL.md +217 -421
  207. package/pipeline/skills/shared/external/speech-recognition/evals/evals.json +23 -26
  208. package/pipeline/skills/shared/external/speech-recognition/references/speechanalyzer-patterns.md +133 -125
  209. package/pipeline/skills/shared/external/storekit/SKILL.md +228 -204
  210. package/pipeline/skills/shared/external/storekit/evals/evals.json +27 -24
  211. package/pipeline/skills/shared/external/storekit/references/app-review-guidelines.md +98 -109
  212. package/pipeline/skills/shared/external/storekit/references/core-patterns.md +298 -242
  213. package/pipeline/skills/shared/external/storekit/references/storekit-advanced.md +356 -649
  214. package/pipeline/skills/shared/external/swift-api-design-guidelines/SKILL.md +274 -399
  215. package/pipeline/skills/shared/external/swift-api-design-guidelines/evals/evals.json +22 -24
  216. package/pipeline/skills/shared/external/swift-api-design-guidelines/references/argument-labels-and-parameters.md +107 -108
  217. package/pipeline/skills/shared/external/swift-api-design-guidelines/references/conventions-and-special-rules.md +93 -165
  218. package/pipeline/skills/shared/external/swift-api-design-guidelines/references/naming-and-clarity.md +99 -137
  219. package/pipeline/skills/shared/external/swift-api-design-guidelines/references/side-effects-and-mutating-pairs.md +77 -120
  220. package/pipeline/skills/shared/external/swift-architecture/SKILL.md +334 -350
  221. package/pipeline/skills/shared/external/swift-architecture/evals/evals.json +22 -22
  222. package/pipeline/skills/shared/external/swift-charts/SKILL.md +208 -394
  223. package/pipeline/skills/shared/external/swift-charts/evals/evals.json +27 -30
  224. package/pipeline/skills/shared/external/swift-charts/references/charts-patterns.md +351 -762
  225. package/pipeline/skills/shared/external/swift-codable/SKILL.md +339 -343
  226. package/pipeline/skills/shared/external/swift-codable/evals/evals.json +20 -20
  227. package/pipeline/skills/shared/external/swift-concurrency/SKILL.md +303 -351
  228. package/pipeline/skills/shared/external/swift-concurrency/evals/evals.json +27 -24
  229. package/pipeline/skills/shared/external/swift-concurrency/references/approachable-concurrency.md +65 -80
  230. package/pipeline/skills/shared/external/swift-concurrency/references/async-algorithms.md +48 -84
  231. package/pipeline/skills/shared/external/swift-concurrency/references/bridging-interop.md +134 -79
  232. package/pipeline/skills/shared/external/swift-concurrency/references/concurrency-patterns.md +145 -167
  233. package/pipeline/skills/shared/external/swift-concurrency/references/diagnostics.md +62 -50
  234. package/pipeline/skills/shared/external/swift-concurrency/references/swiftui-concurrency.md +92 -121
  235. package/pipeline/skills/shared/external/swift-concurrency/references/synchronization-primitives.md +177 -241
  236. package/pipeline/skills/shared/external/swift-formatstyle/SKILL.md +258 -234
  237. package/pipeline/skills/shared/external/swift-language/SKILL.md +342 -382
  238. package/pipeline/skills/shared/external/swift-language/evals/evals.json +24 -27
  239. package/pipeline/skills/shared/external/swift-language/references/swift-attributes-interop.md +79 -56
  240. package/pipeline/skills/shared/external/swift-language/references/swift-patterns-extended.md +297 -340
  241. package/pipeline/skills/shared/external/swift-security/SKILL.md +180 -161
  242. package/pipeline/skills/shared/external/swift-security/evals/evals.json +25 -25
  243. package/pipeline/skills/shared/external/swift-security/references/biometric-authentication.md +314 -469
  244. package/pipeline/skills/shared/external/swift-security/references/certificate-trust.md +408 -476
  245. package/pipeline/skills/shared/external/swift-security/references/common-anti-patterns.md +260 -530
  246. package/pipeline/skills/shared/external/swift-security/references/compliance-owasp-mapping.md +270 -477
  247. package/pipeline/skills/shared/external/swift-security/references/credential-storage-patterns.md +573 -571
  248. package/pipeline/skills/shared/external/swift-security/references/cryptokit-public-key.md +370 -441
  249. package/pipeline/skills/shared/external/swift-security/references/cryptokit-symmetric.md +332 -433
  250. package/pipeline/skills/shared/external/swift-security/references/keychain-access-control.md +346 -468
  251. package/pipeline/skills/shared/external/swift-security/references/keychain-fundamentals.md +352 -472
  252. package/pipeline/skills/shared/external/swift-security/references/keychain-item-classes.md +431 -432
  253. package/pipeline/skills/shared/external/swift-security/references/keychain-sharing.md +328 -425
  254. package/pipeline/skills/shared/external/swift-security/references/migration-legacy-stores.md +341 -579
  255. package/pipeline/skills/shared/external/swift-security/references/secure-enclave.md +396 -457
  256. package/pipeline/skills/shared/external/swift-security/references/testing-security-code.md +354 -614
  257. package/pipeline/skills/shared/external/swift-testing/SKILL.md +188 -175
  258. package/pipeline/skills/shared/external/swift-testing/evals/evals.json +26 -24
  259. package/pipeline/skills/shared/external/swift-testing/references/testing-advanced.md +80 -84
  260. package/pipeline/skills/shared/external/swift-testing/references/testing-patterns.md +317 -433
  261. package/pipeline/skills/shared/external/swiftdata/SKILL.md +392 -256
  262. package/pipeline/skills/shared/external/swiftdata/evals/evals.json +24 -24
  263. package/pipeline/skills/shared/external/swiftdata/references/core-data-coexistence.md +206 -402
  264. package/pipeline/skills/shared/external/swiftdata/references/indexing.md +59 -52
  265. package/pipeline/skills/shared/external/swiftdata/references/predicate-pitfalls.md +57 -33
  266. package/pipeline/skills/shared/external/swiftdata/references/swiftdata-advanced.md +354 -747
  267. package/pipeline/skills/shared/external/swiftdata/references/swiftdata-queries.md +300 -508
  268. package/pipeline/skills/shared/external/swiftlint/SKILL.md +175 -226
  269. package/pipeline/skills/shared/external/swiftlint/references/adoption-and-configuration.md +141 -208
  270. package/pipeline/skills/shared/external/swiftlint/references/custom-rules-and-analyze.md +100 -109
  271. package/pipeline/skills/shared/external/swiftlint/references/plugins-run-scripts-and-integrations.md +159 -179
  272. package/pipeline/skills/shared/external/swiftlint/references/rule-reference.md +383 -18
  273. package/pipeline/skills/shared/external/swiftlint/references/rules-suppressions-and-baselines.md +143 -229
  274. package/pipeline/skills/shared/external/swiftui-animation/SKILL.md +283 -366
  275. package/pipeline/skills/shared/external/swiftui-animation/references/animation-advanced.md +396 -608
  276. package/pipeline/skills/shared/external/swiftui-animation/references/core-animation-bridge.md +336 -385
  277. package/pipeline/skills/shared/external/swiftui-gestures/SKILL.md +239 -349
  278. package/pipeline/skills/shared/external/swiftui-gestures/references/gesture-patterns.md +228 -310
  279. package/pipeline/skills/shared/external/swiftui-layout-components/SKILL.md +260 -249
  280. package/pipeline/skills/shared/external/swiftui-layout-components/references/form.md +92 -74
  281. package/pipeline/skills/shared/external/swiftui-layout-components/references/grids.md +112 -177
  282. package/pipeline/skills/shared/external/swiftui-layout-components/references/list.md +61 -64
  283. package/pipeline/skills/shared/external/swiftui-layout-components/references/scrollview.md +94 -134
  284. package/pipeline/skills/shared/external/swiftui-liquid-glass/SKILL.md +193 -225
  285. package/pipeline/skills/shared/external/swiftui-liquid-glass/references/liquid-glass.md +173 -327
  286. package/pipeline/skills/shared/external/swiftui-navigation/SKILL.md +193 -168
  287. package/pipeline/skills/shared/external/swiftui-navigation/references/deeplinks.md +127 -150
  288. package/pipeline/skills/shared/external/swiftui-navigation/references/navigationstack.md +132 -133
  289. package/pipeline/skills/shared/external/swiftui-navigation/references/sheets.md +152 -117
  290. package/pipeline/skills/shared/external/swiftui-navigation/references/tabview.md +106 -140
  291. package/pipeline/skills/shared/external/swiftui-patterns/SKILL.md +316 -252
  292. package/pipeline/skills/shared/external/swiftui-patterns/references/architecture-patterns.md +341 -332
  293. package/pipeline/skills/shared/external/swiftui-patterns/references/deprecated-migration.md +547 -854
  294. package/pipeline/skills/shared/external/swiftui-patterns/references/design-polish.md +485 -537
  295. package/pipeline/skills/shared/external/swiftui-patterns/references/platform-and-sharing.md +417 -499
  296. package/pipeline/skills/shared/external/swiftui-performance/SKILL.md +213 -376
  297. package/pipeline/skills/shared/external/swiftui-performance/references/demystify-swiftui-performance-wwdc23.md +86 -175
  298. package/pipeline/skills/shared/external/swiftui-performance/references/optimizing-swiftui-performance-instruments.md +89 -195
  299. package/pipeline/skills/shared/external/swiftui-performance/references/understanding-hangs-in-your-app.md +95 -182
  300. package/pipeline/skills/shared/external/swiftui-performance/references/understanding-improving-swiftui-performance.md +71 -149
  301. package/pipeline/skills/shared/external/swiftui-performance/references/wwdc-session-sources.md +21 -27
  302. package/pipeline/skills/shared/external/swiftui-uikit-interop/SKILL.md +303 -295
  303. package/pipeline/skills/shared/external/swiftui-uikit-interop/references/hosting-migration.md +204 -387
  304. package/pipeline/skills/shared/external/swiftui-uikit-interop/references/representable-recipes.md +469 -683
  305. package/pipeline/skills/shared/external/swiftui-webkit/SKILL.md +140 -186
  306. package/pipeline/skills/shared/external/swiftui-webkit/references/loading-and-observation.md +75 -86
  307. package/pipeline/skills/shared/external/swiftui-webkit/references/local-content-and-custom-schemes.md +63 -60
  308. package/pipeline/skills/shared/external/swiftui-webkit/references/migration-and-fallbacks.md +69 -137
  309. package/pipeline/skills/shared/external/swiftui-webkit/references/navigation-and-javascript.md +95 -67
  310. package/pipeline/skills/shared/external/tailwind-css/SKILL.md +1 -0
  311. package/pipeline/skills/shared/external/testing-backend/SKILL.md +1 -0
  312. package/pipeline/skills/shared/external/tipkit/SKILL.md +220 -335
  313. package/pipeline/skills/shared/external/tipkit/references/tipkit-patterns.md +356 -494
  314. package/pipeline/skills/shared/external/typescript-patterns/SKILL.md +1 -0
  315. package/pipeline/skills/shared/external/vision-framework/SKILL.md +260 -375
  316. package/pipeline/skills/shared/external/vision-framework/references/vision-requests.md +393 -515
  317. package/pipeline/skills/shared/external/vision-framework/references/visionkit-scanner.md +363 -539
  318. package/pipeline/skills/shared/external/vue-composition/SKILL.md +1 -0
  319. package/pipeline/skills/shared/external/weatherkit/SKILL.md +152 -310
  320. package/pipeline/skills/shared/external/weatherkit/references/weatherkit-patterns.md +288 -407
  321. package/pipeline/skills/shared/external/web-accessibility/SKILL.md +1 -0
  322. package/pipeline/skills/shared/external/web-performance/SKILL.md +1 -0
  323. package/pipeline/skills/shared/external/web-testing/SKILL.md +1 -0
  324. package/pipeline/skills/shared/external/widgetkit/SKILL.md +216 -288
  325. package/pipeline/skills/shared/external/widgetkit/references/widgetkit-advanced.md +414 -719
  326. package/pipeline/skills/shared/external/NOTICE-swift-ios-skills.md +0 -39
@@ -1,117 +1,147 @@
1
1
  # Media Accessibility
2
2
 
3
- Accessibility patterns for audio and video content using AVFoundation.
3
+ Back to [SKILL.md](../SKILL.md).
4
4
 
5
- ## Contents
5
+ How to make audio and video accessible with AVFoundation: tagging and choosing
6
+ caption and audio-description tracks, following system settings, and building
7
+ player controls that assistive technologies can use.
6
8
 
7
- - [Closed Captions and Subtitles](#closed-captions-and-subtitles)
8
- - [SwiftUI VideoPlayer](#swiftui-videoplayer)
9
- - [Custom Player Controls](#custom-player-controls)
9
+ ## Captions, SDH and subtitles
10
10
 
11
- ## Closed Captions and Subtitles
11
+ AVFoundation marks accessibility-related tracks with media characteristics
12
+ (`AVMediaCharacteristic`,
13
+ https://developer.apple.com/documentation/avfoundation/avmediacharacteristic).
12
14
 
13
- ### AVMediaCharacteristic Tags
15
+ | Characteristic | Meaning |
16
+ |---|---|
17
+ | `.transcribesSpokenDialogForAccessibility` | Text of what is said, as captions or SDH, for viewers who are deaf or hard of hearing |
18
+ | `.describesMusicAndSoundForAccessibility` | The text track also covers music and sound effects, not just speech |
19
+ | `.describesVideoForAccessibility` | An audio track that narrates the picture for viewers who are blind or have low vision |
20
+ | `.easyToRead` | Captions written in simpler language, for cognitive accessibility |
21
+ | `.containsOnlyForcedSubtitles` | Only the forced lines, shown where the content's language differs from the device's |
22
+ | `.languageTranslation` | Subtitles translating speech into another language |
14
23
 
15
- AVFoundation uses media characteristics to identify accessibility tracks:
16
-
17
- Docs: [AVMediaCharacteristic](https://sosumi.ai/documentation/avfoundation/avmediacharacteristic)
18
-
19
- | Characteristic | Purpose |
20
- | -------------- | ------- |
21
- | `.transcribesSpokenDialogForAccessibility` | Captions/SDH - transcribes dialog for deaf or hard of hearing users |
22
- | `.describesMusicAndSoundForAccessibility` | Captions that include descriptions of music and sound effects |
23
- | `.describesVideoForAccessibility` | Audio descriptions - narrates visual content for blind or low-vision users |
24
- | `.easyToRead` | Simplified captions for cognitive accessibility |
25
- | `.containsOnlyForcedSubtitles` | Subtitles that display only when content differs from the device language |
26
- | `.languageTranslation` | Subtitles providing a language translation |
27
-
28
- ### Selecting Accessible Media
24
+ ## Picking an accessible caption track
29
25
 
30
26
  ```swift
31
27
  import AVFoundation
32
28
 
33
- let asset = AVURLAsset(url: videoURL)
34
- let group = try await asset.load(.mediaSelectionGroup(forMediaCharacteristic: .legible))
29
+ @MainActor
30
+ func makeCaptionedItem(for movieURL: URL) async throws -> AVPlayerItem {
31
+ let movie = AVURLAsset(url: movieURL)
32
+ let item = AVPlayerItem(asset: movie)
35
33
 
36
- if let group {
37
- // Find the closed caption option
38
- let ccOptions = AVMediaSelectionGroup.mediaSelectionOptions(
39
- from: group.options,
40
- with: .transcribesSpokenDialogForAccessibility
34
+ guard let legible = try await movie.loadMediaSelectionGroup(for: .legible) else {
35
+ return item
36
+ }
37
+ let sdhOptions = AVMediaSelectionGroup.mediaSelectionOptions(
38
+ from: legible.options,
39
+ withMediaCharacteristics: [.transcribesSpokenDialogForAccessibility]
41
40
  )
42
-
43
- if let ccOption = ccOptions.first {
44
- let playerItem = AVPlayerItem(asset: asset)
45
- playerItem.select(ccOption, in: group)
41
+ if let sdh = sdhOptions.first {
42
+ item.select(sdh, in: legible)
46
43
  }
44
+ return item
47
45
  }
48
46
  ```
49
47
 
50
- ### Audio Descriptions
48
+ `AVPlayerItem` is a main-actor class. Its `select(_:in:)` is exempt only when
49
+ the deployment target is iOS 16 or later, so the function is `@MainActor` to
50
+ build for older targets too.
51
51
 
52
- ```swift
53
- let adGroup = try await asset.load(.mediaSelectionGroup(forMediaCharacteristic: .audible))
52
+ ## Picking an audio description track
54
53
 
55
- if let adGroup {
56
- let adOptions = AVMediaSelectionGroup.mediaSelectionOptions(
57
- from: adGroup.options,
58
- with: .describesVideoForAccessibility
59
- )
54
+ Same approach on the audible group:
60
55
 
61
- if let adOption = adOptions.first {
62
- playerItem.select(adOption, in: adGroup)
56
+ ```swift
57
+ @MainActor
58
+ func enableAudioDescription(on item: AVPlayerItem, source: AVAsset) async throws {
59
+ guard let audible = try await source.loadMediaSelectionGroup(for: .audible) else { return }
60
+ let described = AVMediaSelectionGroup.mediaSelectionOptions(
61
+ from: audible.options,
62
+ withMediaCharacteristics: [.describesVideoForAccessibility]
63
+ )
64
+ if let track = described.first {
65
+ item.select(track, in: audible)
63
66
  }
64
67
  }
65
68
  ```
66
69
 
67
- ### System Accessibility Settings
70
+ ## Following the system settings
68
71
 
69
- AVPlayer automatically selects captioned/described tracks when the user
70
- enables these in Settings → Accessibility → Subtitles & Captioning. You don't
71
- need manual selection unless providing a custom media selection UI.
72
+ When a user turns on captions or audio descriptions in Settings >
73
+ Accessibility > Subtitles & Captioning, `AVPlayer` picks matching tracks on its
74
+ own. Select options by hand only when you build your own media-selection UI.
72
75
 
73
- Check user preferences:
76
+ To read the caption preference yourself:
74
77
 
75
78
  ```swift
76
79
  import MediaAccessibility
77
80
 
78
- let captioningEnabled = MACaptionAppearanceIsDisplayedAutomatically(.user)
81
+ let displayType = MACaptionAppearanceGetDisplayType(.user)
82
+ let captionsShowByDefault = displayType == .alwaysOn || displayType == .automatic
79
83
  ```
80
84
 
81
- ## SwiftUI VideoPlayer
85
+ UIKit apps can also check `UIAccessibility.isClosedCaptioningEnabled` and
86
+ observe `UIAccessibility.closedCaptioningStatusDidChangeNotification`.
82
87
 
83
- SwiftUI's `VideoPlayer` inherits AVPlayer's automatic accessibility track
84
- selection:
88
+ ## SwiftUI `VideoPlayer`
89
+
90
+ `VideoPlayer` from AVKit wraps `AVPlayer`, so it gets the same automatic track
91
+ selection.
85
92
 
86
93
  ```swift
87
94
  import AVKit
88
95
  import SwiftUI
89
96
 
90
- struct AccessibleVideoView: View {
91
- let player: AVPlayer
97
+ struct LessonPlayer: View {
98
+ let lessonPlayer: AVPlayer
99
+ let lessonTitle: String
92
100
 
93
101
  var body: some View {
94
- VideoPlayer(player: player)
95
- .accessibilityLabel("Training video")
96
- .accessibilityHint("Double-tap to play or pause")
102
+ VideoPlayer(player: lessonPlayer)
103
+ .accessibilityLabel("Video: \(lessonTitle)")
104
+ .accessibilityHint("Plays or pauses the lesson")
97
105
  }
98
106
  }
99
107
  ```
100
108
 
101
- ## Custom Player Controls
109
+ ## Custom player controls
102
110
 
103
- When building custom video controls, ensure:
111
+ A custom transport bar has to provide what the system player gives you for
112
+ free:
104
113
 
105
- - Play/pause, seek, and volume controls are all focusable and labeled
106
- - Current time and duration are announced on focus changes
107
- - Captions toggle is available and labeled
108
- - Progress slider uses `accessibilityValue` to announce time position
109
- - Controls remain visible/accessible when captions overlay is active
114
+ - play/pause, seek and volume are focusable and labelled;
115
+ - current time and duration are spoken when focus reaches them;
116
+ - a captions toggle exists and is labelled;
117
+ - the scrubber reports the time position through `accessibilityValue`;
118
+ - controls stay visible and reachable while captions are on screen.
110
119
 
111
120
  ```swift
112
- Button(action: toggleCaptions) {
113
- Image(systemName: captionsEnabled ? "captions.bubble.fill" : "captions.bubble")
121
+ struct CaptionsButton: View {
122
+ @Binding var captionsOn: Bool
123
+
124
+ var body: some View {
125
+ Button(action: { captionsOn.toggle() }) {
126
+ Image(systemName: "captions.bubble")
127
+ .symbolVariant(captionsOn ? .fill : .none)
128
+ }
129
+ .accessibilityLabel(captionsOn ? "Captions on" : "Captions off")
130
+ .accessibilityHint("Turns subtitles and captions on or off")
131
+ }
132
+ }
133
+
134
+ struct Scrubber: View {
135
+ @Binding var position: Double // seconds
136
+ let duration: Double
137
+
138
+ var body: some View {
139
+ Slider(value: $position, in: 0...duration)
140
+ .accessibilityLabel("Playback position")
141
+ .accessibilityValue(
142
+ "\(Duration.seconds(position).formatted(.time(pattern: .minuteSecond))) of "
143
+ + "\(Duration.seconds(duration).formatted(.time(pattern: .minuteSecond)))"
144
+ )
145
+ }
114
146
  }
115
- .accessibilityLabel(captionsEnabled ? "Captions on" : "Captions off")
116
- .accessibilityHint("Toggles closed captions")
117
147
  ```
@@ -1,141 +1,205 @@
1
1
  # App Store Accessibility Nutrition Labels
2
2
 
3
- App Store Connect lets you declare which accessibility features your app
4
- supports. These labels appear on the product page and help users find apps
5
- that support their needs before they download.
6
-
7
- Docs:
8
- - [Overview of Accessibility Nutrition Labels](https://developer.apple.com/help/app-store-connect/manage-app-accessibility/overview-of-accessibility-nutrition-labels)
9
- - [Manage Accessibility Nutrition Labels](https://developer.apple.com/help/app-store-connect/manage-app-accessibility/manage-accessibility-nutrition-labels)
10
-
11
- ## Contents
12
-
13
- - [Current Label Categories](#current-label-categories)
14
- - [Claim Rule](#claim-rule)
15
- - [Pass / Fail Criteria](#pass--fail-criteria)
16
- - [SwiftUI Audit Example](#swiftui-audit-example)
17
- - [Related Non-Label Accessibility Work](#related-non-label-accessibility-work)
18
-
19
- ## Current Label Categories
20
-
21
- Apple's current App Store Accessibility Nutrition Labels are:
22
-
23
- | Label | What It Means | Key Implementation |
24
- |-------|---------------|-------------------|
25
- | **VoiceOver** | Users can navigate, understand, and operate the app with VoiceOver | Concise labels, values, traits, logical order, alternatives for images/charts, accessible custom controls |
26
- | **Voice Control** | Users can navigate and operate the app with voice commands | Speakable visible/accessibility labels, `accessibilityInputLabels`, custom actions for hidden or gesture-only behavior |
27
- | **Larger Text** | Text can scale to at least 200% where supported | Dynamic Type or an equivalent in-app scaling control, layouts that avoid clipping and overlap |
28
- | **Dark Interface** | The app can keep common-task UI dark | System Dark Mode or an equivalent dark mode without bright flashes in common tasks |
29
- | **Differentiate Without Color Alone** | Color is not the only way to convey information | Text, shape, icon, position, or pattern alternatives for color-coded state and data |
30
- | **Sufficient Contrast** | Text, icons, controls, and state indicators have enough contrast | Semantic colors, high-contrast variants, Reduce Transparency handling, contrast checks in light and dark appearances |
31
- | **Reduced Motion** | Problematic motion can be reduced or replaced | Respect Reduce Motion; replace parallax, spinning, scaling, depth, and ongoing motion with fades or static states where appropriate |
32
- | **Captions** | Dialogue and relevant sounds are available as text for video or audio content | Captions, SDH, subtitles, or transcripts; detect and honor system caption settings |
33
- | **Audio Descriptions** | Visual time-based content has narrated descriptions | Audio description tracks or equivalent narration for video, cut scenes, and visual-only cues |
34
-
35
- Apple states these labels appear on Apple devices running iOS 26, iPadOS 26,
36
- macOS 26, tvOS 26, visionOS 26, and watchOS 26 or later. App Store Connect asks
37
- only for labels that apply to the device type.
38
-
39
- ## Claim Rule
40
-
41
- Only claim a label when users can complete all common tasks of the app using
42
- that feature. Build a task matrix per device and test the common workflows
43
- before answering in App Store Connect.
44
-
45
- Keep claims accurate over time and do not treat App Store accessibility answers
46
- as marketing claims. Apple notes that App Review may contact developers to
47
- update intentionally misleading or harmful accessibility labels.
48
-
49
- ## Pass / Fail Criteria
3
+ Back to [SKILL.md](../SKILL.md).
4
+
5
+ App Store Connect lets a developer state which accessibility features an app
6
+ supports, and the App Store shows those statements on the product page. A
7
+ person can then judge, before installing, whether the app will work with the
8
+ way they use their device.
9
+
10
+ Apple's help pages (App Store Connect Help, section "Manage app
11
+ accessibility"):
12
+
13
+ - Overview:
14
+ https://developer.apple.com/help/app-store-connect/manage-app-accessibility/overview-of-accessibility-nutrition-labels
15
+ - Managing the labels:
16
+ https://developer.apple.com/help/app-store-connect/manage-app-accessibility/manage-accessibility-nutrition-labels
17
+
18
+ ## The nine categories
19
+
20
+ There are nine labels today. Each one below says what a user can expect when
21
+ it is shown, and what the app has to do to earn it.
22
+
23
+ 1. **VoiceOver.** A blind user can find, understand and operate everything.
24
+ Needs: concise labels with values and traits, a sensible reading order,
25
+ descriptions or text equivalents for images and charts, custom controls
26
+ that behave like real ones.
27
+ 2. **Voice Control.** Everything can be done by speaking. Needs: labels a
28
+ person can pronounce, `accessibilityInputLabels` where the label is
29
+ unwieldy, and custom actions for anything hidden behind a gesture.
30
+ 3. **Larger Text.** Text can grow to 200% or more where the platform supports
31
+ it. Needs: Dynamic Type, or an in-app text size setting that does the same
32
+ job, without clipping or overlapping.
33
+ 4. **Dark Interface.** The screens used for common tasks can stay dark. Needs:
34
+ support for system Dark Mode or an equivalent in-app theme, and no white
35
+ flashes along the way.
36
+ 5. **Differentiate Without Color Alone.** No meaning is carried by color on
37
+ its own. Needs: a second cue such as a word, shape, icon, pattern or
38
+ position.
39
+ 6. **Sufficient Contrast.** Text, icons, controls and state markers are easy to
40
+ tell from their background. Needs: semantic colors, high-contrast variants,
41
+ handling for Reduce Transparency, checks in both light and dark
42
+ appearances.
43
+ 7. **Reduced Motion.** Motion that can cause discomfort can be switched off.
44
+ Needs: the Reduce Motion setting respected, with parallax, spinning,
45
+ scaling, depth effects and continuous animation replaced by fades or still
46
+ frames.
47
+ 8. **Captions.** Speech and meaningful sounds in video and audio are available
48
+ as text. Needs: captions, SDH, subtitles or transcripts, and respect for the
49
+ caption preferences set in the system.
50
+ 9. **Audio Descriptions.** What happens on screen in time-based media is also
51
+ narrated. Needs: an audio-description track, or narration that does the
52
+ same job, for videos, cut scenes and cues that are only visual.
53
+
54
+ Facts about where the labels appear:
55
+
56
+ - Devices running iOS 26, iPadOS 26, macOS 26, tvOS 26, visionOS 26 and
57
+ watchOS 26, or anything newer, display them.
58
+ - App Store Connect only asks about labels that apply to the device type in
59
+ question.
60
+
61
+ Watch the names. Older drafts and the Settings app use different words:
62
+
63
+ | Say this (label) | Not this |
64
+ |---|---|
65
+ | Captions | Closed Captions / SDH |
66
+ | Sufficient Contrast | Increase Contrast |
67
+ | Reduced Motion | Reduce Motion (that is the setting, not the label) |
68
+
69
+ ## Rules for claiming a label
70
+
71
+ - A label is claimed only if people can get through **every** common task in
72
+ the app with that feature.
73
+ - Write the common tasks down per device type, run each one with the feature
74
+ on, and only then fill in App Store Connect.
75
+ - Re-check the answers as the app changes. They describe the product; they
76
+ are not advertising.
77
+ - If a label is intentionally misleading or harmful, App Review may contact
78
+ the developer to have it corrected.
79
+
80
+ Two important features have no label of their own at the moment: Switch
81
+ Control and Full Keyboard Access. They remain part of the job, and their
82
+ guidance lives in [SKILL.md](../SKILL.md) and the
83
+ [code patterns](a11y-patterns.md).
84
+
85
+ ## What passes and what fails
50
86
 
51
87
  ### VoiceOver
52
88
 
53
- - Every interactive element has a concise, meaningful label.
54
- - Labels avoid control types and state words that VoiceOver already announces.
55
- - Images and charts provide useful descriptions or text alternatives.
56
- - Decorative images are hidden.
57
- - Custom controls expose role, value, action, and traversal order.
58
- - Dynamic content that matters is announced with the appropriate accessibility notification.
89
+ - Short, meaningful label on every control.
90
+ - No control type or state in the label when VoiceOver already announces it.
91
+ - Charts and informative images come with a description or a text version.
92
+ - Purely decorative imagery is hidden.
93
+ - Custom controls report their role, value and action, and sit in a sensible
94
+ place in the reading order.
95
+ - Changes that matter are announced with the matching accessibility
96
+ notification.
59
97
 
60
98
  ### Voice Control
61
99
 
62
- - Common tasks work using only voice commands.
63
- - Visible labels and Voice Control names match whenever practical.
64
- - `accessibilityInputLabels` provide short spoken alternatives for long labels.
65
- - "Show Names" and "Show Numbers" expose all interactive elements.
66
- - Swipes, long presses, hover-only controls, and hidden actions have a speech-only path, usually through custom accessibility actions.
100
+ - Each common task can be finished by voice with nothing else.
101
+ - On-screen wording and the spoken name agree wherever that is practical.
102
+ - Where a label is long, `accessibilityInputLabels` offers a short spoken
103
+ version.
104
+ - Every interactive element shows up under both the names overlay and the
105
+ numbers overlay.
106
+ - Anything that needs a swipe, a long press, a hover or is otherwise hidden
107
+ has a route by speech alone, normally a custom accessibility action.
67
108
 
68
109
  ### Larger Text
69
110
 
70
- - Text reaches at least 200% of the default size where the platform supports the label.
71
- - Main workflows avoid clipped, overlapped, or severely truncated text.
72
- - Layouts adapt at accessibility text sizes, often by switching from horizontal to vertical composition.
73
- - Meaningful icons or text-like graphics scale or have an equivalent perceivable alternative.
111
+ - Where the platform supports this label, text reaches 200% of its default
112
+ size or more.
113
+ - Core workflows show no clipped, colliding or badly cut-off text.
114
+ - At accessibility sizes, layouts reflow, commonly from side-by-side to
115
+ stacked.
116
+ - Icons and images that work like text either scale with it or have an
117
+ equivalent people can perceive.
74
118
 
75
119
  ### Dark Interface
76
120
 
77
- - Common-task screens remain dark when the user selects a dark appearance or the app's dark setting.
78
- - Bright loading flashes, interstitials, and modal surfaces are avoided.
79
- - Dark mode is tested together with sufficient contrast settings.
121
+ - With dark appearance chosen in the system or in the app, common-task
122
+ screens remain dark.
123
+ - No bright splash while loading, no light interstitials, no white modal
124
+ sheets.
125
+ - Try the dark theme again with the contrast settings switched on.
80
126
 
81
127
  ### Differentiate Without Color Alone
82
128
 
83
- - Status, validation, selection, chart series, and game/team state never rely on color alone.
84
- - Use text, symbols, shape, order, pattern, or direct labels in addition to color.
85
- - Test important workflows with grayscale or color filters to find hidden reliance on color.
129
+ - Chart series, selection, validation, status and game or team state all
130
+ have a cue besides color.
131
+ - That cue can be a word, a symbol, a shape, an ordering, a pattern or a
132
+ direct label.
133
+ - Run the important flows with a grayscale or color filter on; anything that
134
+ becomes ambiguous depends on color.
86
135
 
87
136
  ### Sufficient Contrast
88
137
 
89
- - Most text meets generally accepted contrast guidance, commonly 4.5:1 against its background.
90
- - Non-text state indicators and custom controls have sufficient contrast, commonly 3:1.
91
- - Test light mode, dark mode, Increase Contrast, Bold Text, and Reduce Transparency combinations.
92
- - Custom colors provide high-contrast variants when semantic system colors are not enough.
138
+ - Body text usually needs a ratio of at least 4.5:1 with its background.
139
+ - Custom controls and non-text indicators of state usually need at least 3:1.
140
+ - Check the combinations: light and dark appearance, each with Increase
141
+ Contrast, Bold Text and Reduce Transparency.
142
+ - When semantic system colors cannot cover a case, custom colors get their own
143
+ high-contrast variants.
93
144
 
94
145
  ### Reduced Motion
95
146
 
96
- - Disable or replace parallax, spinning, scaling, vortex, multi-axis, multi-speed, and depth-simulating motion when Reduce Motion is enabled.
97
- - Stop ongoing motion such as auto-advancing carousels or provide a user control to stop it.
98
- - Preserve meaning when replacing motion; use fades, highlights, or instant transitions for state changes.
147
+ - Under Reduce Motion, turn off or replace depth simulation, vortex and
148
+ spinning effects, scaling, parallax, and motion along several axes or at
149
+ several speeds.
150
+ - Anything that keeps moving by itself, such as an auto-advancing carousel,
151
+ either stops or gives the user a control to stop it.
152
+ - The replacement still communicates the same thing: a fade, a highlight or
153
+ an immediate change.
99
154
 
100
155
  ### Captions
101
156
 
102
- - Video dialogue and comprehension-relevant sound effects are captioned.
103
- - Captions are synchronized, readable, and identify speakers where needed.
104
- - Audio-only dialogue has a transcript when time-synchronized captions do not apply.
105
- - AVFoundation media uses appropriate characteristics such as `.transcribesSpokenDialogForAccessibility` and `.describesMusicAndSoundForAccessibility`.
157
+ - Dialogue in video, and sound effects needed to follow it, are captioned.
158
+ - Captions keep time with the audio, are easy to read and name the speaker
159
+ when that is not obvious.
160
+ - Where synced captions do not fit, audio-only dialogue comes with a
161
+ transcript.
162
+ - In AVFoundation the tracks carry `.transcribesSpokenDialogForAccessibility`
163
+ and `.describesMusicAndSoundForAccessibility`
164
+ (details in [media accessibility](media-accessibility.md)).
106
165
 
107
166
  ### Audio Descriptions
108
167
 
109
- - Visual-only story, instructions, scene changes, on-screen text, and important cues are narrated.
110
- - Descriptions fit natural pauses and do not obscure essential dialogue.
111
- - AVFoundation media uses `.describesVideoForAccessibility` for audio description options.
168
+ - The narration covers on-screen text, scene changes, instructions, story
169
+ beats that are only visible, and any other important visual cue.
170
+ - It is placed in natural gaps and never talks over dialogue people need.
171
+ - In AVFoundation the description tracks carry
172
+ `.describesVideoForAccessibility`.
112
173
 
113
- ## SwiftUI Audit Example
174
+ ## Auditing a SwiftUI screen
114
175
 
115
176
  ```swift
116
- struct ContentView: View {
117
- @Environment(\.accessibilityReduceMotion) private var reduceMotion
177
+ struct RecipeHeroView: View {
118
178
  @Environment(\.dynamicTypeSize) private var typeSize
179
+ @Environment(\.accessibilityReduceMotion) private var reduceMotion
180
+ @State private var isSaved = false
181
+ let recipe: Recipe
119
182
 
120
183
  var body: some View {
121
- VStack {
122
- Image("hero")
123
- .accessibilityLabel("Mountain landscape at sunset")
124
-
125
- Text("Welcome")
126
- .font(.title)
127
-
128
- Button("Get Started") { }
129
- .accessibilityHint("Opens the onboarding flow")
184
+ let stack = typeSize.isAccessibilitySize
185
+ ? AnyLayout(VStackLayout(alignment: .leading))
186
+ : AnyLayout(HStackLayout(alignment: .top))
187
+
188
+ stack {
189
+ Image(recipe.photoName)
190
+ .resizable()
191
+ .scaledToFit()
192
+ .accessibilityLabel(recipe.photoDescription) // VoiceOver
193
+ Text(recipe.title)
194
+ .font(.title) // Larger Text
195
+ Button(isSaved ? "Saved" : "Save recipe") { isSaved.toggle() }
196
+ .accessibilityHint("Adds this recipe to your cookbook")
130
197
  }
131
- .animation(reduceMotion ? nil : .spring(), value: showContent)
198
+ .scaleEffect(isSaved ? 1.02 : 1)
199
+ .animation(reduceMotion ? nil : .spring(), value: isSaved) // Reduced Motion
132
200
  }
133
201
  }
134
202
  ```
135
203
 
136
- ## Related Non-Label Accessibility Work
137
-
138
- Switch Control and Full Keyboard Access remain important app accessibility
139
- requirements, but they are not current App Store Accessibility Nutrition Label
140
- categories. Keep their implementation guidance in `SKILL.md` and
141
- `references/a11y-patterns.md`.
204
+ Each commented line maps to one label's pass criteria, and the layout switch
205
+ covers the "reflows at accessibility sizes" check.
@@ -3,6 +3,7 @@ name: ios-coding-standard
3
3
  description: "The iOS coding-standard rule registry: 99 stable-ID rules across readability, security, service layer, business rules, concurrency, testing, module boundaries, naming and visibility, each with a severity and enforcement kind. Use when writing or reviewing Swift and you need the project rule rather than an opinion, or on a persistence, logging or business-rule-placement question."
4
4
  user-invocable: true
5
5
  metadata:
6
+ source: multi-agent-pipeline
6
7
  standards-registry: references/rules.yml
7
8
  ---
8
9