buildanything 1.7.1 → 2.0.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 (633) hide show
  1. package/.claude-plugin/marketplace.json +3 -3
  2. package/.claude-plugin/plugin.json +9 -3
  3. package/CHANGELOG.md +112 -0
  4. package/README.md +2 -2
  5. package/agents/a11y-architect.md +166 -0
  6. package/agents/business-model.md +80 -29
  7. package/agents/code-architect.md +75 -0
  8. package/agents/code-reviewer.md +255 -0
  9. package/agents/code-simplifier.md +64 -0
  10. package/agents/design-brand-guardian.md +293 -53
  11. package/agents/design-critic.md +139 -0
  12. package/agents/design-inclusive-visuals-specialist.md +6 -19
  13. package/agents/design-ui-designer.md +335 -56
  14. package/agents/design-ux-architect.md +403 -55
  15. package/agents/design-ux-researcher.md +264 -49
  16. package/agents/engineering-ai-engineer.md +26 -36
  17. package/agents/engineering-backend-architect.md +185 -36
  18. package/agents/engineering-data-engineer.md +225 -43
  19. package/agents/engineering-devops-automator.md +227 -74
  20. package/agents/engineering-frontend-developer.md +210 -34
  21. package/agents/engineering-mobile-app-builder.md +6 -1
  22. package/agents/engineering-rapid-prototyper.md +30 -9
  23. package/agents/engineering-security-engineer.md +263 -61
  24. package/agents/engineering-senior-developer.md +128 -19
  25. package/agents/engineering-sre.md +84 -0
  26. package/agents/engineering-technical-writer.md +285 -41
  27. package/agents/feature-intel.md +110 -0
  28. package/agents/ios-app-review-guardian.md +66 -0
  29. package/agents/ios-foundation-models-specialist.md +64 -0
  30. package/agents/ios-storekit-specialist.md +59 -0
  31. package/agents/ios-swift-architect.md +129 -0
  32. package/agents/ios-swift-search.md +137 -0
  33. package/agents/ios-swift-ui-design.md +136 -0
  34. package/agents/marketing-app-store-optimizer.md +246 -64
  35. package/agents/planner.md +216 -0
  36. package/agents/pr-test-analyzer.md +63 -0
  37. package/agents/product-feedback-synthesizer.md +8 -2
  38. package/agents/refactor-cleaner.md +102 -0
  39. package/agents/security-reviewer.md +128 -0
  40. package/agents/silent-failure-hunter.md +54 -0
  41. package/agents/swift-build-resolver.md +119 -0
  42. package/agents/swift-reviewer.md +112 -0
  43. package/agents/tech-feasibility.md +21 -1
  44. package/agents/testing-api-tester.md +236 -59
  45. package/agents/testing-evidence-collector.md +26 -1
  46. package/agents/testing-performance-benchmarker.md +21 -1
  47. package/agents/testing-reality-checker.md +6 -1
  48. package/agents/visual-research.md +116 -0
  49. package/bin/adapters/cycle-counter-tool.ts +155 -0
  50. package/bin/adapters/scribe-tool.ts +71 -0
  51. package/bin/adapters/state-save-tool.ts +130 -0
  52. package/bin/adapters/write-lease-tool.ts +127 -0
  53. package/bin/buildanything-runtime.js +15 -0
  54. package/bin/buildanything-runtime.ts +328 -0
  55. package/bin/setup.js +83 -8
  56. package/commands/add-feature.md +2 -0
  57. package/commands/build.md +752 -332
  58. package/commands/fix.md +65 -0
  59. package/commands/self-check.md +121 -0
  60. package/commands/setup.md +114 -0
  61. package/commands/ux-review.md +63 -0
  62. package/commands/verify.md +69 -0
  63. package/docs/migration/agents.yaml +729 -0
  64. package/docs/migration/phase-graph.yaml +1088 -0
  65. package/docs/migration/sdk-host-compat.md +18 -0
  66. package/hooks/compile-writer-owner-cache.ts +171 -0
  67. package/hooks/hooks.json +36 -0
  68. package/hooks/pre-tool-use +19 -0
  69. package/hooks/pre-tool-use.ts +776 -0
  70. package/hooks/record-mode-transitions.ts +178 -0
  71. package/hooks/session-start +89 -2
  72. package/hooks/subagent-start +17 -0
  73. package/hooks/subagent-start.ts +471 -0
  74. package/hooks/subagent-stop +17 -0
  75. package/hooks/subagent-stop.ts +153 -0
  76. package/package.json +28 -5
  77. package/protocols/architecture-schema.md +171 -0
  78. package/protocols/build-fix.md +52 -0
  79. package/protocols/cleanup.md +54 -0
  80. package/protocols/decision-log.md +131 -0
  81. package/protocols/eval-harness.md +61 -0
  82. package/protocols/fake-data-detector.md +64 -0
  83. package/protocols/ios-context.md +234 -0
  84. package/protocols/ios-frameworks-map.md +323 -0
  85. package/protocols/ios-phase-branches.md +337 -0
  86. package/protocols/ios-preflight.md +27 -0
  87. package/protocols/launch-readiness.md +258 -0
  88. package/protocols/metric-loop.md +153 -0
  89. package/protocols/smoke-test.md +118 -0
  90. package/protocols/state-schema.json +388 -0
  91. package/protocols/state-schema.md +172 -0
  92. package/protocols/verify.md +127 -0
  93. package/protocols/visual-dna.md +185 -0
  94. package/protocols/web-phase-branches.md +351 -0
  95. package/skills/ios/_VENDORED.md +62 -0
  96. package/skills/ios/activitykit/LICENSE +131 -0
  97. package/skills/ios/activitykit/SKILL.md +505 -0
  98. package/skills/ios/activitykit/references/activitykit-patterns.md +868 -0
  99. package/skills/ios/app-intents/LICENSE +131 -0
  100. package/skills/ios/app-intents/SKILL.md +494 -0
  101. package/skills/ios/app-intents/references/appintents-advanced.md +1076 -0
  102. package/skills/ios/app-store-connect-metadata/SKILL.md +148 -0
  103. package/skills/ios/apple-on-device-ai/LICENSE +131 -0
  104. package/skills/ios/apple-on-device-ai/SKILL.md +505 -0
  105. package/skills/ios/apple-on-device-ai/references/coreml-conversion.md +425 -0
  106. package/skills/ios/apple-on-device-ai/references/coreml-optimization.md +344 -0
  107. package/skills/ios/apple-on-device-ai/references/foundation-models.md +508 -0
  108. package/skills/ios/apple-on-device-ai/references/mlx-swift.md +285 -0
  109. package/skills/ios/asc-privacy-manifest/SKILL.md +350 -0
  110. package/skills/ios/hig-components-content/SKILL.md +86 -0
  111. package/skills/ios/hig-components-content/references/activity-views.md +79 -0
  112. package/skills/ios/hig-components-content/references/charts.md +180 -0
  113. package/skills/ios/hig-components-content/references/collections.md +48 -0
  114. package/skills/ios/hig-components-content/references/color-wells.md +42 -0
  115. package/skills/ios/hig-components-content/references/image-views.md +82 -0
  116. package/skills/ios/hig-components-content/references/image-wells.md +34 -0
  117. package/skills/ios/hig-components-content/references/lockups.md +78 -0
  118. package/skills/ios/hig-components-content/references/web-views.md +36 -0
  119. package/skills/ios/hig-components-controls/SKILL.md +88 -0
  120. package/skills/ios/hig-components-controls/references/combo-boxes.md +40 -0
  121. package/skills/ios/hig-components-controls/references/controls.md +112 -0
  122. package/skills/ios/hig-components-controls/references/gauges.md +74 -0
  123. package/skills/ios/hig-components-controls/references/labels.md +92 -0
  124. package/skills/ios/hig-components-controls/references/pickers.md +128 -0
  125. package/skills/ios/hig-components-controls/references/rating-indicators.md +38 -0
  126. package/skills/ios/hig-components-controls/references/segmented-controls.md +94 -0
  127. package/skills/ios/hig-components-controls/references/sliders.md +92 -0
  128. package/skills/ios/hig-components-controls/references/steppers.md +40 -0
  129. package/skills/ios/hig-components-controls/references/text-fields.md +88 -0
  130. package/skills/ios/hig-components-controls/references/text-views.md +56 -0
  131. package/skills/ios/hig-components-controls/references/toggles.md +127 -0
  132. package/skills/ios/hig-components-controls/references/token-fields.md +48 -0
  133. package/skills/ios/hig-components-controls/references/virtual-keyboards.md +156 -0
  134. package/skills/ios/hig-components-dialogs/SKILL.md +76 -0
  135. package/skills/ios/hig-components-dialogs/references/action-sheets.md +74 -0
  136. package/skills/ios/hig-components-dialogs/references/alerts.md +158 -0
  137. package/skills/ios/hig-components-dialogs/references/digit-entry-views.md +32 -0
  138. package/skills/ios/hig-components-dialogs/references/popovers.md +81 -0
  139. package/skills/ios/hig-components-dialogs/references/sheets.md +157 -0
  140. package/skills/ios/hig-components-layout/SKILL.md +99 -0
  141. package/skills/ios/hig-components-layout/references/boxes.md +48 -0
  142. package/skills/ios/hig-components-layout/references/column-views.md +44 -0
  143. package/skills/ios/hig-components-layout/references/lists-and-tables.md +99 -0
  144. package/skills/ios/hig-components-layout/references/ornaments.md +56 -0
  145. package/skills/ios/hig-components-layout/references/outline-views.md +64 -0
  146. package/skills/ios/hig-components-layout/references/panels.md +75 -0
  147. package/skills/ios/hig-components-layout/references/scroll-views.md +123 -0
  148. package/skills/ios/hig-components-layout/references/sidebars.md +109 -0
  149. package/skills/ios/hig-components-layout/references/split-views.md +110 -0
  150. package/skills/ios/hig-components-layout/references/tab-bars.md +173 -0
  151. package/skills/ios/hig-components-layout/references/tab-views.md +68 -0
  152. package/skills/ios/hig-components-layout/references/windows.md +188 -0
  153. package/skills/ios/hig-components-menus/SKILL.md +81 -0
  154. package/skills/ios/hig-components-menus/references/action-button.md +61 -0
  155. package/skills/ios/hig-components-menus/references/buttons.md +261 -0
  156. package/skills/ios/hig-components-menus/references/context-menus.md +105 -0
  157. package/skills/ios/hig-components-menus/references/disclosure-controls.md +84 -0
  158. package/skills/ios/hig-components-menus/references/dock-menus.md +40 -0
  159. package/skills/ios/hig-components-menus/references/edit-menus.md +88 -0
  160. package/skills/ios/hig-components-menus/references/menus.md +171 -0
  161. package/skills/ios/hig-components-menus/references/pop-up-buttons.md +70 -0
  162. package/skills/ios/hig-components-menus/references/pull-down-buttons.md +77 -0
  163. package/skills/ios/hig-components-menus/references/the-menu-bar.md +303 -0
  164. package/skills/ios/hig-components-menus/references/toolbars.md +256 -0
  165. package/skills/ios/hig-components-search/SKILL.md +68 -0
  166. package/skills/ios/hig-components-search/references/page-controls.md +120 -0
  167. package/skills/ios/hig-components-search/references/path-controls.md +40 -0
  168. package/skills/ios/hig-components-search/references/search-fields.md +189 -0
  169. package/skills/ios/hig-components-status/SKILL.md +80 -0
  170. package/skills/ios/hig-components-status/references/activity-rings.md +105 -0
  171. package/skills/ios/hig-components-status/references/progress-indicators.md +116 -0
  172. package/skills/ios/hig-components-status/references/status-bars.md +38 -0
  173. package/skills/ios/hig-components-system/SKILL.md +88 -0
  174. package/skills/ios/hig-components-system/references/app-clips.md +387 -0
  175. package/skills/ios/hig-components-system/references/app-shortcuts.md +114 -0
  176. package/skills/ios/hig-components-system/references/complications.md +425 -0
  177. package/skills/ios/hig-components-system/references/home-screen-quick-actions.md +42 -0
  178. package/skills/ios/hig-components-system/references/live-activities.md +442 -0
  179. package/skills/ios/hig-components-system/references/notifications.md +153 -0
  180. package/skills/ios/hig-components-system/references/top-shelf.md +135 -0
  181. package/skills/ios/hig-components-system/references/watch-faces.md +40 -0
  182. package/skills/ios/hig-components-system/references/widgets.md +517 -0
  183. package/skills/ios/hig-foundations/SKILL.md +98 -0
  184. package/skills/ios/hig-foundations/references/accessibility.md +291 -0
  185. package/skills/ios/hig-foundations/references/app-icons.md +210 -0
  186. package/skills/ios/hig-foundations/references/branding.md +44 -0
  187. package/skills/ios/hig-foundations/references/color.md +274 -0
  188. package/skills/ios/hig-foundations/references/dark-mode.md +116 -0
  189. package/skills/ios/hig-foundations/references/icons.md +263 -0
  190. package/skills/ios/hig-foundations/references/images.md +176 -0
  191. package/skills/ios/hig-foundations/references/immersive-experiences.md +174 -0
  192. package/skills/ios/hig-foundations/references/inclusion.md +189 -0
  193. package/skills/ios/hig-foundations/references/layout.md +425 -0
  194. package/skills/ios/hig-foundations/references/materials.md +238 -0
  195. package/skills/ios/hig-foundations/references/motion.md +103 -0
  196. package/skills/ios/hig-foundations/references/privacy.md +231 -0
  197. package/skills/ios/hig-foundations/references/right-to-left.md +206 -0
  198. package/skills/ios/hig-foundations/references/sf-symbols.md +310 -0
  199. package/skills/ios/hig-foundations/references/spatial-layout.md +142 -0
  200. package/skills/ios/hig-foundations/references/typography.md +1146 -0
  201. package/skills/ios/hig-foundations/references/writing.md +91 -0
  202. package/skills/ios/hig-inputs/SKILL.md +94 -0
  203. package/skills/ios/hig-inputs/references/apple-pencil-and-scribble.md +148 -0
  204. package/skills/ios/hig-inputs/references/camera-control.md +107 -0
  205. package/skills/ios/hig-inputs/references/digital-crown.md +83 -0
  206. package/skills/ios/hig-inputs/references/eyes.md +120 -0
  207. package/skills/ios/hig-inputs/references/focus-and-selection.md +120 -0
  208. package/skills/ios/hig-inputs/references/game-controls.md +156 -0
  209. package/skills/ios/hig-inputs/references/gestures.md +208 -0
  210. package/skills/ios/hig-inputs/references/gyro-and-accelerometer.md +40 -0
  211. package/skills/ios/hig-inputs/references/keyboards.md +234 -0
  212. package/skills/ios/hig-inputs/references/nearby-interactions.md +70 -0
  213. package/skills/ios/hig-inputs/references/pointing-devices.md +237 -0
  214. package/skills/ios/hig-inputs/references/remotes.md +67 -0
  215. package/skills/ios/hig-inputs/references/spatial-interactions.md +70 -0
  216. package/skills/ios/hig-patterns/SKILL.md +104 -0
  217. package/skills/ios/hig-patterns/references/charting-data.md +81 -0
  218. package/skills/ios/hig-patterns/references/collaboration-and-sharing.md +86 -0
  219. package/skills/ios/hig-patterns/references/drag-and-drop.md +134 -0
  220. package/skills/ios/hig-patterns/references/entering-data.md +69 -0
  221. package/skills/ios/hig-patterns/references/feedback.md +67 -0
  222. package/skills/ios/hig-patterns/references/file-management.md +135 -0
  223. package/skills/ios/hig-patterns/references/going-full-screen.md +79 -0
  224. package/skills/ios/hig-patterns/references/launching.md +81 -0
  225. package/skills/ios/hig-patterns/references/live-viewing-apps.md +79 -0
  226. package/skills/ios/hig-patterns/references/loading.md +59 -0
  227. package/skills/ios/hig-patterns/references/managing-accounts.md +107 -0
  228. package/skills/ios/hig-patterns/references/managing-notifications.md +99 -0
  229. package/skills/ios/hig-patterns/references/modality.md +82 -0
  230. package/skills/ios/hig-patterns/references/multitasking.md +131 -0
  231. package/skills/ios/hig-patterns/references/offering-help.md +117 -0
  232. package/skills/ios/hig-patterns/references/onboarding.md +69 -0
  233. package/skills/ios/hig-patterns/references/playing-audio.md +124 -0
  234. package/skills/ios/hig-patterns/references/playing-haptics.md +280 -0
  235. package/skills/ios/hig-patterns/references/playing-video.md +180 -0
  236. package/skills/ios/hig-patterns/references/printing.md +50 -0
  237. package/skills/ios/hig-patterns/references/ratings-and-reviews.md +48 -0
  238. package/skills/ios/hig-patterns/references/searching.md +70 -0
  239. package/skills/ios/hig-patterns/references/settings.md +84 -0
  240. package/skills/ios/hig-patterns/references/undo-and-redo.md +58 -0
  241. package/skills/ios/hig-patterns/references/workouts.md +76 -0
  242. package/skills/ios/hig-platforms/SKILL.md +84 -0
  243. package/skills/ios/hig-platforms/references/designing-for-games.md +159 -0
  244. package/skills/ios/hig-platforms/references/designing-for-ios.md +66 -0
  245. package/skills/ios/hig-platforms/references/designing-for-ipados.md +64 -0
  246. package/skills/ios/hig-platforms/references/designing-for-macos.md +70 -0
  247. package/skills/ios/hig-platforms/references/designing-for-tvos.md +68 -0
  248. package/skills/ios/hig-platforms/references/designing-for-visionos.md +85 -0
  249. package/skills/ios/hig-platforms/references/designing-for-watchos.md +74 -0
  250. package/skills/ios/hig-project-context/SKILL.md +133 -0
  251. package/skills/ios/hig-technologies/SKILL.md +107 -0
  252. package/skills/ios/hig-technologies/references/airplay.md +125 -0
  253. package/skills/ios/hig-technologies/references/always-on.md +62 -0
  254. package/skills/ios/hig-technologies/references/apple-pay.md +441 -0
  255. package/skills/ios/hig-technologies/references/augmented-reality.md +247 -0
  256. package/skills/ios/hig-technologies/references/carekit.md +224 -0
  257. package/skills/ios/hig-technologies/references/carplay.md +119 -0
  258. package/skills/ios/hig-technologies/references/game-center.md +343 -0
  259. package/skills/ios/hig-technologies/references/generative-ai.md +110 -0
  260. package/skills/ios/hig-technologies/references/healthkit.md +120 -0
  261. package/skills/ios/hig-technologies/references/homekit.md +343 -0
  262. package/skills/ios/hig-technologies/references/icloud.md +52 -0
  263. package/skills/ios/hig-technologies/references/id-verifier.md +73 -0
  264. package/skills/ios/hig-technologies/references/imessage-apps-and-stickers.md +105 -0
  265. package/skills/ios/hig-technologies/references/in-app-purchase.md +263 -0
  266. package/skills/ios/hig-technologies/references/live-photos.md +54 -0
  267. package/skills/ios/hig-technologies/references/mac-catalyst.md +216 -0
  268. package/skills/ios/hig-technologies/references/machine-learning.md +394 -0
  269. package/skills/ios/hig-technologies/references/maps.md +221 -0
  270. package/skills/ios/hig-technologies/references/nfc.md +51 -0
  271. package/skills/ios/hig-technologies/references/photo-editing.md +40 -0
  272. package/skills/ios/hig-technologies/references/researchkit.md +134 -0
  273. package/skills/ios/hig-technologies/references/shareplay.md +142 -0
  274. package/skills/ios/hig-technologies/references/shazamkit.md +47 -0
  275. package/skills/ios/hig-technologies/references/sign-in-with-apple.md +288 -0
  276. package/skills/ios/hig-technologies/references/siri.md +523 -0
  277. package/skills/ios/hig-technologies/references/tap-to-pay-on-iphone.md +208 -0
  278. package/skills/ios/hig-technologies/references/voiceover.md +90 -0
  279. package/skills/ios/hig-technologies/references/wallet.md +420 -0
  280. package/skills/ios/ios-26-platform/SKILL.md +53 -0
  281. package/skills/ios/ios-26-platform/references/automatic-adoption.md +161 -0
  282. package/skills/ios/ios-26-platform/references/backward-compat.md +238 -0
  283. package/skills/ios/ios-26-platform/references/liquid-glass.md +255 -0
  284. package/skills/ios/ios-26-platform/references/swiftui-apis.md +277 -0
  285. package/skills/ios/ios-26-platform/references/toolbar-navigation.md +250 -0
  286. package/skills/ios/ios-bootstrap/SKILL.md +107 -0
  287. package/skills/ios/ios-bootstrap/references/apple-docs-mcp-config.md +28 -0
  288. package/skills/ios/ios-bootstrap/references/new-project-dialog.md +41 -0
  289. package/skills/ios/ios-bootstrap/references/xcode-mcp-config.md +29 -0
  290. package/skills/ios/ios-debugger-agent/LICENSE +21 -0
  291. package/skills/ios/ios-debugger-agent/SKILL.md +58 -0
  292. package/skills/ios/ios-debugger-agent/agents/openai.yaml +4 -0
  293. package/skills/ios/ios-entitlements-generator/SKILL.md +47 -0
  294. package/skills/ios/ios-info-plist-hardening/SKILL.md +130 -0
  295. package/skills/ios/ios-maestro-flow-author/SKILL.md +68 -0
  296. package/skills/ios/ios-maestro-flow-author/references/input-and-scroll.yaml +17 -0
  297. package/skills/ios/ios-maestro-flow-author/references/modal-and-dismiss.yaml +14 -0
  298. package/skills/ios/ios-maestro-flow-author/references/onboarding-flow.yaml +16 -0
  299. package/skills/ios/ios-maestro-flow-author/references/tab-navigation.yaml +13 -0
  300. package/skills/ios/ios-maestro-flow-author/references/tap-and-assert.yaml +9 -0
  301. package/skills/ios/swift-accessibility/LICENSE +21 -0
  302. package/skills/ios/swift-accessibility/SKILL.md +371 -0
  303. package/skills/ios/swift-accessibility/examples/before-after-appkit.md +446 -0
  304. package/skills/ios/swift-accessibility/examples/before-after-swiftui.md +441 -0
  305. package/skills/ios/swift-accessibility/examples/before-after-uikit.md +464 -0
  306. package/skills/ios/swift-accessibility/references/assistive-access.md +441 -0
  307. package/skills/ios/swift-accessibility/references/display-settings.md +491 -0
  308. package/skills/ios/swift-accessibility/references/dynamic-type.md +420 -0
  309. package/skills/ios/swift-accessibility/references/media-accessibility.md +421 -0
  310. package/skills/ios/swift-accessibility/references/motor-input.md +393 -0
  311. package/skills/ios/swift-accessibility/references/nutrition-labels.md +362 -0
  312. package/skills/ios/swift-accessibility/references/platform-specifics.md +515 -0
  313. package/skills/ios/swift-accessibility/references/semantic-structure.md +585 -0
  314. package/skills/ios/swift-accessibility/references/testing-auditing.md +507 -0
  315. package/skills/ios/swift-accessibility/references/voice-control.md +317 -0
  316. package/skills/ios/swift-accessibility/references/voiceover-swiftui.md +584 -0
  317. package/skills/ios/swift-accessibility/references/voiceover-uikit.md +519 -0
  318. package/skills/ios/swift-accessibility/references/wcag-mapping.md +167 -0
  319. package/skills/ios/swift-accessibility/resources/audit-template.swift +128 -0
  320. package/skills/ios/swift-accessibility/resources/qa-checklist.md +258 -0
  321. package/skills/ios/swift-actor-persistence/SKILL.md +143 -0
  322. package/skills/ios/swift-concurrency/LICENSE +21 -0
  323. package/skills/ios/swift-concurrency/SKILL.md +171 -0
  324. package/skills/ios/swift-concurrency/references/_index.md +50 -0
  325. package/skills/ios/swift-concurrency/references/actors.md +660 -0
  326. package/skills/ios/swift-concurrency/references/async-algorithms.md +847 -0
  327. package/skills/ios/swift-concurrency/references/async-await-basics.md +266 -0
  328. package/skills/ios/swift-concurrency/references/async-sequences.md +710 -0
  329. package/skills/ios/swift-concurrency/references/core-data.md +560 -0
  330. package/skills/ios/swift-concurrency/references/glossary.md +135 -0
  331. package/skills/ios/swift-concurrency/references/linting.md +155 -0
  332. package/skills/ios/swift-concurrency/references/memory-management.md +569 -0
  333. package/skills/ios/swift-concurrency/references/migration.md +1104 -0
  334. package/skills/ios/swift-concurrency/references/performance.md +593 -0
  335. package/skills/ios/swift-concurrency/references/sendable.md +598 -0
  336. package/skills/ios/swift-concurrency/references/tasks.md +636 -0
  337. package/skills/ios/swift-concurrency/references/testing.md +592 -0
  338. package/skills/ios/swift-concurrency/references/threading.md +495 -0
  339. package/skills/ios/swift-concurrency-6-2/SKILL.md +216 -0
  340. package/skills/ios/swift-protocol-di-testing/SKILL.md +190 -0
  341. package/skills/ios/swift-security-expert/LICENSE +21 -0
  342. package/skills/ios/swift-security-expert/SKILL.md +470 -0
  343. package/skills/ios/swift-security-expert/references/biometric-authentication.md +565 -0
  344. package/skills/ios/swift-security-expert/references/certificate-trust.md +592 -0
  345. package/skills/ios/swift-security-expert/references/common-anti-patterns.md +690 -0
  346. package/skills/ios/swift-security-expert/references/compliance-owasp-mapping.md +537 -0
  347. package/skills/ios/swift-security-expert/references/credential-storage-patterns.md +721 -0
  348. package/skills/ios/swift-security-expert/references/cryptokit-public-key.md +505 -0
  349. package/skills/ios/swift-security-expert/references/cryptokit-symmetric.md +497 -0
  350. package/skills/ios/swift-security-expert/references/keychain-access-control.md +508 -0
  351. package/skills/ios/swift-security-expert/references/keychain-fundamentals.md +596 -0
  352. package/skills/ios/swift-security-expert/references/keychain-item-classes.md +476 -0
  353. package/skills/ios/swift-security-expert/references/keychain-sharing.md +458 -0
  354. package/skills/ios/swift-security-expert/references/migration-legacy-stores.md +727 -0
  355. package/skills/ios/swift-security-expert/references/secure-enclave.md +539 -0
  356. package/skills/ios/swift-security-expert/references/testing-security-code.md +781 -0
  357. package/skills/ios/swift-testing-expert/LICENSE +21 -0
  358. package/skills/ios/swift-testing-expert/SKILL.md +79 -0
  359. package/skills/ios/swift-testing-expert/references/_index.md +12 -0
  360. package/skills/ios/swift-testing-expert/references/async-testing-and-waiting.md +127 -0
  361. package/skills/ios/swift-testing-expert/references/expectations.md +145 -0
  362. package/skills/ios/swift-testing-expert/references/fundamentals.md +141 -0
  363. package/skills/ios/swift-testing-expert/references/migration-from-xctest.md +127 -0
  364. package/skills/ios/swift-testing-expert/references/parallelization-and-isolation.md +95 -0
  365. package/skills/ios/swift-testing-expert/references/parameterized-testing.md +284 -0
  366. package/skills/ios/swift-testing-expert/references/performance-and-best-practices.md +187 -0
  367. package/skills/ios/swift-testing-expert/references/traits-and-tags.md +114 -0
  368. package/skills/ios/swift-testing-expert/references/xcode-workflows.md +70 -0
  369. package/skills/ios/swiftdata-pro/LICENSE +21 -0
  370. package/skills/ios/swiftdata-pro/SKILL.md +102 -0
  371. package/skills/ios/swiftdata-pro/agents/openai.yaml +10 -0
  372. package/skills/ios/swiftdata-pro/assets/swiftdata-pro-icon.png +0 -0
  373. package/skills/ios/swiftdata-pro/assets/swiftdata-pro-icon.svg +29 -0
  374. package/skills/ios/swiftdata-pro/references/class-inheritance.md +104 -0
  375. package/skills/ios/swiftdata-pro/references/cloudkit.md +10 -0
  376. package/skills/ios/swiftdata-pro/references/core-rules.md +20 -0
  377. package/skills/ios/swiftdata-pro/references/indexing.md +27 -0
  378. package/skills/ios/swiftdata-pro/references/predicates.md +73 -0
  379. package/skills/ios/swiftui-design-principles/AGENTS.md +21 -0
  380. package/skills/ios/swiftui-design-principles/LICENSE +21 -0
  381. package/skills/ios/swiftui-design-principles/README.md +41 -0
  382. package/skills/ios/swiftui-design-principles/SKILL.md +605 -0
  383. package/skills/ios/swiftui-design-principles/metadata.json +10 -0
  384. package/skills/ios/swiftui-design-tokens/SKILL.md +475 -0
  385. package/skills/ios/swiftui-liquid-glass/LICENSE +21 -0
  386. package/skills/ios/swiftui-liquid-glass/SKILL.md +95 -0
  387. package/skills/ios/swiftui-liquid-glass/agents/openai.yaml +4 -0
  388. package/skills/ios/swiftui-liquid-glass/references/liquid-glass.md +280 -0
  389. package/skills/ios/swiftui-performance-audit/LICENSE +21 -0
  390. package/skills/ios/swiftui-performance-audit/SKILL.md +111 -0
  391. package/skills/ios/swiftui-performance-audit/agents/openai.yaml +4 -0
  392. package/skills/ios/swiftui-performance-audit/references/code-smells.md +150 -0
  393. package/skills/ios/swiftui-performance-audit/references/demystify-swiftui-performance-wwdc23.md +46 -0
  394. package/skills/ios/swiftui-performance-audit/references/optimizing-swiftui-performance-instruments.md +29 -0
  395. package/skills/ios/swiftui-performance-audit/references/profiling-intake.md +44 -0
  396. package/skills/ios/swiftui-performance-audit/references/report-template.md +47 -0
  397. package/skills/ios/swiftui-performance-audit/references/understanding-hangs-in-your-app.md +33 -0
  398. package/skills/ios/swiftui-performance-audit/references/understanding-improving-swiftui-performance.md +52 -0
  399. package/skills/ios/swiftui-pro/LICENSE +21 -0
  400. package/skills/ios/swiftui-pro/SKILL.md +108 -0
  401. package/skills/ios/swiftui-pro/agents/openai.yaml +10 -0
  402. package/skills/ios/swiftui-pro/assets/swiftui-pro-icon.png +0 -0
  403. package/skills/ios/swiftui-pro/assets/swiftui-pro-icon.svg +29 -0
  404. package/skills/ios/swiftui-pro/references/accessibility.md +13 -0
  405. package/skills/ios/swiftui-pro/references/api.md +39 -0
  406. package/skills/ios/swiftui-pro/references/data.md +43 -0
  407. package/skills/ios/swiftui-pro/references/design.md +31 -0
  408. package/skills/ios/swiftui-pro/references/hygiene.md +9 -0
  409. package/skills/ios/swiftui-pro/references/navigation.md +14 -0
  410. package/skills/ios/swiftui-pro/references/performance.md +46 -0
  411. package/skills/ios/swiftui-pro/references/swift.md +56 -0
  412. package/skills/ios/swiftui-pro/references/views.md +35 -0
  413. package/skills/ios/swiftui-ui-patterns/LICENSE +21 -0
  414. package/skills/ios/swiftui-ui-patterns/SKILL.md +100 -0
  415. package/skills/ios/swiftui-ui-patterns/agents/openai.yaml +4 -0
  416. package/skills/ios/swiftui-ui-patterns/references/app-wiring.md +201 -0
  417. package/skills/ios/swiftui-ui-patterns/references/async-state.md +96 -0
  418. package/skills/ios/swiftui-ui-patterns/references/components-index.md +50 -0
  419. package/skills/ios/swiftui-ui-patterns/references/controls.md +57 -0
  420. package/skills/ios/swiftui-ui-patterns/references/deeplinks.md +66 -0
  421. package/skills/ios/swiftui-ui-patterns/references/focus.md +90 -0
  422. package/skills/ios/swiftui-ui-patterns/references/form.md +97 -0
  423. package/skills/ios/swiftui-ui-patterns/references/grids.md +71 -0
  424. package/skills/ios/swiftui-ui-patterns/references/haptics.md +71 -0
  425. package/skills/ios/swiftui-ui-patterns/references/input-toolbar.md +51 -0
  426. package/skills/ios/swiftui-ui-patterns/references/lightweight-clients.md +93 -0
  427. package/skills/ios/swiftui-ui-patterns/references/list.md +86 -0
  428. package/skills/ios/swiftui-ui-patterns/references/loading-placeholders.md +38 -0
  429. package/skills/ios/swiftui-ui-patterns/references/macos-settings.md +71 -0
  430. package/skills/ios/swiftui-ui-patterns/references/matched-transitions.md +59 -0
  431. package/skills/ios/swiftui-ui-patterns/references/media.md +73 -0
  432. package/skills/ios/swiftui-ui-patterns/references/menu-bar.md +101 -0
  433. package/skills/ios/swiftui-ui-patterns/references/navigationstack.md +159 -0
  434. package/skills/ios/swiftui-ui-patterns/references/overlay.md +45 -0
  435. package/skills/ios/swiftui-ui-patterns/references/performance.md +62 -0
  436. package/skills/ios/swiftui-ui-patterns/references/previews.md +48 -0
  437. package/skills/ios/swiftui-ui-patterns/references/scroll-reveal.md +133 -0
  438. package/skills/ios/swiftui-ui-patterns/references/scrollview.md +87 -0
  439. package/skills/ios/swiftui-ui-patterns/references/searchable.md +71 -0
  440. package/skills/ios/swiftui-ui-patterns/references/sheets.md +155 -0
  441. package/skills/ios/swiftui-ui-patterns/references/split-views.md +72 -0
  442. package/skills/ios/swiftui-ui-patterns/references/tabview.md +114 -0
  443. package/skills/ios/swiftui-ui-patterns/references/theming.md +71 -0
  444. package/skills/ios/swiftui-ui-patterns/references/title-menus.md +93 -0
  445. package/skills/ios/swiftui-ui-patterns/references/top-bar.md +49 -0
  446. package/skills/ios/swiftui-view-refactor/LICENSE +21 -0
  447. package/skills/ios/swiftui-view-refactor/SKILL.md +207 -0
  448. package/skills/ios/swiftui-view-refactor/agents/openai.yaml +4 -0
  449. package/skills/ios/swiftui-view-refactor/references/mv-patterns.md +161 -0
  450. package/skills/ios/widgetkit/LICENSE +131 -0
  451. package/skills/ios/widgetkit/SKILL.md +502 -0
  452. package/skills/ios/widgetkit/references/widgetkit-advanced.md +871 -0
  453. package/skills/ios/writing-for-interfaces/SKILL.md +75 -0
  454. package/skills/web/accessibility/SKILL.md +146 -0
  455. package/skills/web/aceternity-ui/SKILL.md +719 -0
  456. package/skills/web/aceternity-ui/metadata.json +10 -0
  457. package/skills/web/api-design/SKILL.md +523 -0
  458. package/skills/web/chart-accessibility/SKILL.md +332 -0
  459. package/skills/web/composition-patterns/AGENTS.md +946 -0
  460. package/skills/web/composition-patterns/README.md +60 -0
  461. package/skills/web/composition-patterns/SKILL.md +89 -0
  462. package/skills/web/composition-patterns/metadata.json +11 -0
  463. package/skills/web/composition-patterns/rules/_sections.md +29 -0
  464. package/skills/web/composition-patterns/rules/_template.md +24 -0
  465. package/skills/web/composition-patterns/rules/architecture-avoid-boolean-props.md +100 -0
  466. package/skills/web/composition-patterns/rules/architecture-compound-components.md +112 -0
  467. package/skills/web/composition-patterns/rules/patterns-children-over-render-props.md +87 -0
  468. package/skills/web/composition-patterns/rules/patterns-explicit-variants.md +100 -0
  469. package/skills/web/composition-patterns/rules/react19-no-forwardref.md +42 -0
  470. package/skills/web/composition-patterns/rules/state-context-interface.md +191 -0
  471. package/skills/web/composition-patterns/rules/state-decouple-implementation.md +113 -0
  472. package/skills/web/composition-patterns/rules/state-lift-state.md +125 -0
  473. package/skills/web/cost-aware-llm-pipeline/SKILL.md +183 -0
  474. package/skills/web/database-migrations/SKILL.md +429 -0
  475. package/skills/web/deployment-patterns/SKILL.md +427 -0
  476. package/skills/web/docker-patterns/SKILL.md +364 -0
  477. package/skills/web/e2e-testing/SKILL.md +326 -0
  478. package/skills/web/lighthouse-ci/SKILL.md +361 -0
  479. package/skills/web/mcp-server-patterns/SKILL.md +69 -0
  480. package/skills/web/next-best-practices/SKILL.md +153 -0
  481. package/skills/web/next-best-practices/async-patterns.md +87 -0
  482. package/skills/web/next-best-practices/bundling.md +180 -0
  483. package/skills/web/next-best-practices/data-patterns.md +297 -0
  484. package/skills/web/next-best-practices/debug-tricks.md +105 -0
  485. package/skills/web/next-best-practices/directives.md +73 -0
  486. package/skills/web/next-best-practices/error-handling.md +227 -0
  487. package/skills/web/next-best-practices/file-conventions.md +140 -0
  488. package/skills/web/next-best-practices/font.md +245 -0
  489. package/skills/web/next-best-practices/functions.md +108 -0
  490. package/skills/web/next-best-practices/hydration-error.md +91 -0
  491. package/skills/web/next-best-practices/image.md +173 -0
  492. package/skills/web/next-best-practices/metadata.md +301 -0
  493. package/skills/web/next-best-practices/parallel-routes.md +287 -0
  494. package/skills/web/next-best-practices/route-handlers.md +146 -0
  495. package/skills/web/next-best-practices/rsc-boundaries.md +159 -0
  496. package/skills/web/next-best-practices/runtime-selection.md +39 -0
  497. package/skills/web/next-best-practices/scripts.md +141 -0
  498. package/skills/web/next-best-practices/self-hosting.md +371 -0
  499. package/skills/web/next-best-practices/suspense-boundaries.md +67 -0
  500. package/skills/web/next-cache-components/SKILL.md +411 -0
  501. package/skills/web/postgres-best-practices/SKILL.md +14 -0
  502. package/skills/web/postgres-best-practices/references/schema-design.md +9 -0
  503. package/skills/web/react-best-practices/AGENTS.md +3810 -0
  504. package/skills/web/react-best-practices/README.md +123 -0
  505. package/skills/web/react-best-practices/SKILL.md +149 -0
  506. package/skills/web/react-best-practices/metadata.json +15 -0
  507. package/skills/web/react-best-practices/rules/_sections.md +46 -0
  508. package/skills/web/react-best-practices/rules/_template.md +28 -0
  509. package/skills/web/react-best-practices/rules/advanced-effect-event-deps.md +56 -0
  510. package/skills/web/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
  511. package/skills/web/react-best-practices/rules/advanced-init-once.md +42 -0
  512. package/skills/web/react-best-practices/rules/advanced-use-latest.md +39 -0
  513. package/skills/web/react-best-practices/rules/async-api-routes.md +38 -0
  514. package/skills/web/react-best-practices/rules/async-cheap-condition-before-await.md +37 -0
  515. package/skills/web/react-best-practices/rules/async-defer-await.md +82 -0
  516. package/skills/web/react-best-practices/rules/async-dependencies.md +51 -0
  517. package/skills/web/react-best-practices/rules/async-parallel.md +28 -0
  518. package/skills/web/react-best-practices/rules/async-suspense-boundaries.md +99 -0
  519. package/skills/web/react-best-practices/rules/bundle-analyzable-paths.md +63 -0
  520. package/skills/web/react-best-practices/rules/bundle-barrel-imports.md +60 -0
  521. package/skills/web/react-best-practices/rules/bundle-conditional.md +31 -0
  522. package/skills/web/react-best-practices/rules/bundle-defer-third-party.md +49 -0
  523. package/skills/web/react-best-practices/rules/bundle-dynamic-imports.md +35 -0
  524. package/skills/web/react-best-practices/rules/bundle-preload.md +50 -0
  525. package/skills/web/react-best-practices/rules/client-event-listeners.md +74 -0
  526. package/skills/web/react-best-practices/rules/client-localstorage-schema.md +71 -0
  527. package/skills/web/react-best-practices/rules/client-passive-event-listeners.md +48 -0
  528. package/skills/web/react-best-practices/rules/client-swr-dedup.md +56 -0
  529. package/skills/web/react-best-practices/rules/js-batch-dom-css.md +107 -0
  530. package/skills/web/react-best-practices/rules/js-cache-function-results.md +80 -0
  531. package/skills/web/react-best-practices/rules/js-cache-property-access.md +28 -0
  532. package/skills/web/react-best-practices/rules/js-cache-storage.md +70 -0
  533. package/skills/web/react-best-practices/rules/js-combine-iterations.md +32 -0
  534. package/skills/web/react-best-practices/rules/js-early-exit.md +50 -0
  535. package/skills/web/react-best-practices/rules/js-flatmap-filter.md +60 -0
  536. package/skills/web/react-best-practices/rules/js-hoist-regexp.md +45 -0
  537. package/skills/web/react-best-practices/rules/js-index-maps.md +37 -0
  538. package/skills/web/react-best-practices/rules/js-length-check-first.md +49 -0
  539. package/skills/web/react-best-practices/rules/js-min-max-loop.md +82 -0
  540. package/skills/web/react-best-practices/rules/js-request-idle-callback.md +105 -0
  541. package/skills/web/react-best-practices/rules/js-set-map-lookups.md +24 -0
  542. package/skills/web/react-best-practices/rules/js-tosorted-immutable.md +57 -0
  543. package/skills/web/react-best-practices/rules/rendering-activity.md +26 -0
  544. package/skills/web/react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
  545. package/skills/web/react-best-practices/rules/rendering-conditional-render.md +40 -0
  546. package/skills/web/react-best-practices/rules/rendering-content-visibility.md +38 -0
  547. package/skills/web/react-best-practices/rules/rendering-hoist-jsx.md +46 -0
  548. package/skills/web/react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
  549. package/skills/web/react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
  550. package/skills/web/react-best-practices/rules/rendering-resource-hints.md +85 -0
  551. package/skills/web/react-best-practices/rules/rendering-script-defer-async.md +68 -0
  552. package/skills/web/react-best-practices/rules/rendering-svg-precision.md +28 -0
  553. package/skills/web/react-best-practices/rules/rendering-usetransition-loading.md +75 -0
  554. package/skills/web/react-best-practices/rules/rerender-defer-reads.md +39 -0
  555. package/skills/web/react-best-practices/rules/rerender-dependencies.md +45 -0
  556. package/skills/web/react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
  557. package/skills/web/react-best-practices/rules/rerender-derived-state.md +29 -0
  558. package/skills/web/react-best-practices/rules/rerender-functional-setstate.md +74 -0
  559. package/skills/web/react-best-practices/rules/rerender-lazy-state-init.md +58 -0
  560. package/skills/web/react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
  561. package/skills/web/react-best-practices/rules/rerender-memo.md +44 -0
  562. package/skills/web/react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
  563. package/skills/web/react-best-practices/rules/rerender-no-inline-components.md +82 -0
  564. package/skills/web/react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
  565. package/skills/web/react-best-practices/rules/rerender-split-combined-hooks.md +64 -0
  566. package/skills/web/react-best-practices/rules/rerender-transitions.md +40 -0
  567. package/skills/web/react-best-practices/rules/rerender-use-deferred-value.md +59 -0
  568. package/skills/web/react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
  569. package/skills/web/react-best-practices/rules/server-after-nonblocking.md +73 -0
  570. package/skills/web/react-best-practices/rules/server-auth-actions.md +96 -0
  571. package/skills/web/react-best-practices/rules/server-cache-lru.md +41 -0
  572. package/skills/web/react-best-practices/rules/server-cache-react.md +76 -0
  573. package/skills/web/react-best-practices/rules/server-dedup-props.md +65 -0
  574. package/skills/web/react-best-practices/rules/server-hoist-static-io.md +149 -0
  575. package/skills/web/react-best-practices/rules/server-no-shared-module-state.md +50 -0
  576. package/skills/web/react-best-practices/rules/server-parallel-fetching.md +83 -0
  577. package/skills/web/react-best-practices/rules/server-parallel-nested-fetching.md +34 -0
  578. package/skills/web/react-best-practices/rules/server-serialization.md +38 -0
  579. package/skills/web/seo/SKILL.md +154 -0
  580. package/skills/web/web-design-guidelines/SKILL.md +39 -0
  581. package/skills/web/zap-scan-config/SKILL.md +444 -0
  582. package/skills/web/zap-scan-config/assets/.gitkeep +9 -0
  583. package/skills/web/zap-scan-config/assets/github_action.yml +207 -0
  584. package/skills/web/zap-scan-config/assets/gitlab_ci.yml +226 -0
  585. package/skills/web/zap-scan-config/assets/zap_automation.yaml +196 -0
  586. package/skills/web/zap-scan-config/assets/zap_context.xml +192 -0
  587. package/skills/web/zap-scan-config/references/EXAMPLE.md +40 -0
  588. package/skills/web/zap-scan-config/references/api_testing_guide.md +475 -0
  589. package/skills/web/zap-scan-config/references/authentication_guide.md +431 -0
  590. package/skills/web/zap-scan-config/references/false_positive_handling.md +427 -0
  591. package/skills/web/zap-scan-config/references/owasp_mapping.md +255 -0
  592. package/src/lrr/aggregator.ts +80 -0
  593. package/src/orchestrator/hooks/context-header.ts +95 -0
  594. package/src/orchestrator/hooks/token-accounting-emitter.ts +77 -0
  595. package/src/orchestrator/hooks/token-accounting.ts +101 -0
  596. package/src/orchestrator/mcp/cycle-counter.ts +129 -0
  597. package/src/orchestrator/mcp/scribe.ts +283 -0
  598. package/src/orchestrator/mcp/state-save.ts +149 -0
  599. package/src/orchestrator/mcp/write-lease.ts +167 -0
  600. package/src/orchestrator/phase4-shared-context.ts +41 -0
  601. package/src/orchestrator/schemas/backward-edge.ts +46 -0
  602. package/agents/agentic-identity-trust.md +0 -121
  603. package/agents/data-consolidation-agent.md +0 -39
  604. package/agents/design-image-prompt-engineer.md +0 -105
  605. package/agents/design-visual-storyteller.md +0 -147
  606. package/agents/design-whimsy-injector.md +0 -89
  607. package/agents/engineering-autonomous-optimization-architect.md +0 -105
  608. package/agents/market-intel.md +0 -35
  609. package/agents/marketing-instagram-curator.md +0 -111
  610. package/agents/marketing-reddit-community-builder.md +0 -121
  611. package/agents/marketing-social-media-strategist.md +0 -74
  612. package/agents/marketing-tiktok-strategist.md +0 -123
  613. package/agents/marketing-twitter-engager.md +0 -124
  614. package/agents/marketing-wechat-official-account.md +0 -143
  615. package/agents/marketing-xiaohongshu-specialist.md +0 -136
  616. package/agents/marketing-zhihu-strategist.md +0 -160
  617. package/agents/product-behavioral-nudge-engine.md +0 -78
  618. package/agents/project-management-experiment-tracker.md +0 -102
  619. package/agents/report-distribution-agent.md +0 -43
  620. package/agents/risk-analysis.md +0 -45
  621. package/agents/sales-data-extraction-agent.md +0 -46
  622. package/agents/specialized-cultural-intelligence-strategist.md +0 -65
  623. package/agents/specialized-developer-advocate.md +0 -146
  624. package/agents/support-analytics-reporter.md +0 -133
  625. package/agents/support-executive-summary-generator.md +0 -64
  626. package/agents/support-finance-tracker.md +0 -145
  627. package/agents/support-legal-compliance-checker.md +0 -129
  628. package/agents/support-support-responder.md +0 -91
  629. package/agents/testing-accessibility-auditor.md +0 -110
  630. package/agents/testing-test-results-analyzer.md +0 -97
  631. package/agents/testing-tool-evaluator.md +0 -76
  632. package/agents/testing-workflow-optimizer.md +0 -99
  633. package/agents/user-research.md +0 -40
@@ -0,0 +1,592 @@
1
+ # Certificate Trust Evaluation & Pinning
2
+
3
+ > **Scope**: SecCertificate, SecTrust evaluation, SecIdentity, certificate pinning strategies (leaf / intermediate CA / SPKI hash / NSPinnedDomains), custom trust policies, client certificate authentication (mTLS), ATS interaction, and operational pin management. iOS 12+ through iOS 18, macOS 10.14+ through macOS 15.
4
+ >
5
+ > **Out of scope**: Network-layer encryption beyond TLS certificate handling, server-side certificate management, App Transport Security as a standalone topic (covered briefly where it intersects pinning).
6
+
7
+ ---
8
+
9
+ ## Core Security Types
10
+
11
+ | Type | Purpose | Key Operations |
12
+ | ---------------- | ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- |
13
+ | `SecCertificate` | X.509 certificate (DER-encoded) | `SecCertificateCreateWithData`, `SecCertificateCopyKey` (iOS 12+), `SecCertificateCopyData`, `SecCertificateCopySubjectSummary` |
14
+ | `SecTrust` | Trust evaluation context for a certificate chain against policies | `SecTrustCreateWithCertificates`, `SecTrustEvaluateWithError` (iOS 12+), `SecTrustEvaluateAsyncWithError` (iOS 13+) |
15
+ | `SecIdentity` | Private key + certificate pair for client authentication | Extracted via `SecPKCS12Import`; used with `URLCredential(identity:certificates:persistence:)` |
16
+ | `SecPolicy` | Validation policy (SSL hostname check, revocation) | `SecPolicyCreateSSL`, `SecPolicyCreateRevocation` |
17
+
18
+ ---
19
+
20
+ ## Trust Evaluation APIs
21
+
22
+ Three trust evaluation functions exist. Only two are current.
23
+
24
+ ### SecTrustEvaluateAsyncWithError — recommended async API (iOS 13+)
25
+
26
+ ```swift
27
+ func SecTrustEvaluateAsyncWithError(
28
+ _ trust: SecTrust,
29
+ _ queue: dispatch_queue_t,
30
+ _ result: @escaping (SecTrust, Bool, CFError?) -> Void
31
+ ) -> OSStatus
32
+ ```
33
+
34
+ The callback receives a Boolean result and optional error. The callback may fire synchronously if the trust object has a cached result. Always dispatch on a **background queue** — evaluation may perform network access for intermediate certificate fetching or revocation checks.
35
+
36
+ ```swift
37
+ // ✅ CORRECT: Async trust evaluation with proper error handling
38
+ func evaluateTrust(_ trust: SecTrust, completion: @escaping (Bool, Error?) -> Void) {
39
+ let queue = DispatchQueue.global(qos: .userInitiated)
40
+ queue.async {
41
+ let status = SecTrustEvaluateAsyncWithError(trust, queue) { _, result, error in
42
+ completion(result, error as Error?)
43
+ }
44
+ if status != errSecSuccess {
45
+ completion(false, NSError(domain: NSOSStatusErrorDomain, code: Int(status)))
46
+ }
47
+ }
48
+ }
49
+ ```
50
+
51
+ Apple has **not** added native async/await wrappers to the Security framework through iOS 18. Wrap manually:
52
+
53
+ ```swift
54
+ // ✅ CORRECT: Swift concurrency wrapper
55
+ func evaluateTrust(_ trust: SecTrust) async throws -> Bool {
56
+ try await withCheckedThrowingContinuation { continuation in
57
+ let queue = DispatchQueue.global(qos: .userInitiated)
58
+ queue.async {
59
+ let status = SecTrustEvaluateAsyncWithError(trust, queue) { _, result, error in
60
+ if result {
61
+ continuation.resume(returning: true)
62
+ } else {
63
+ continuation.resume(throwing: error! as Error)
64
+ }
65
+ }
66
+ if status != errSecSuccess {
67
+ continuation.resume(throwing: NSError(
68
+ domain: NSOSStatusErrorDomain, code: Int(status)))
69
+ }
70
+ }
71
+ }
72
+ }
73
+ ```
74
+
75
+ ### SecTrustEvaluateWithError — synchronous, still current (iOS 12+)
76
+
77
+ ```swift
78
+ func SecTrustEvaluateWithError(_ trust: SecTrust, _ error: UnsafeMutablePointer<CFError?>?) -> Bool
79
+ ```
80
+
81
+ **Not deprecated.** Valid inside `URLSessionDelegate` callbacks (already off main thread). Apple's warning: do not call from the main run loop — it may require network access.
82
+
83
+ ### SecTrustEvaluate — deprecated since iOS 13
84
+
85
+ ```swift
86
+ // ❌ DEPRECATED: Returns opaque SecTrustResultType without error context
87
+ func SecTrustEvaluate(_ trust: SecTrust,
88
+ _ result: UnsafeMutablePointer<SecTrustResultType>) -> OSStatus
89
+ ```
90
+
91
+ Returns a `SecTrustResultType` enum requiring manual interpretation. Replaced by `SecTrustEvaluateWithError`. **AI generators frequently produce this pattern — reject on sight.**
92
+
93
+ ### SecTrustResultType reference
94
+
95
+ For code that must inspect results after evaluation via `SecTrustGetTrustResult`:
96
+
97
+ | Result | Meaning | Action |
98
+ | -------------------------- | -------------------------------------------- | --------------------------------- |
99
+ | `.unspecified` | Chain validates to implicitly trusted anchor | **Proceed** — most common success |
100
+ | `.proceed` | User explicitly chose to trust this cert | **Proceed** |
101
+ | `.deny` | User explicitly marked cert as untrusted | **Reject** — never override |
102
+ | `.recoverableTrustFailure` | Failed but recovery possible | Inspect, possibly reconfigure |
103
+ | `.fatalTrustFailure` | Fundamental certificate defect | **Reject** |
104
+ | `.otherError` | Non-trust error (revoked, OS error) | **Reject** |
105
+ | `.invalid` | No evaluation performed yet | Call evaluation first |
106
+
107
+ Modern `SecTrustEvaluateWithError` collapses this to a Boolean. Treat only `.unspecified` and `.proceed` as success.
108
+
109
+ ---
110
+
111
+ ## Custom Trust Policy Configuration
112
+
113
+ ```swift
114
+ // ✅ CORRECT: SSL policy with hostname verification
115
+ let policy = SecPolicyCreateSSL(true, "api.example.com" as CFString)
116
+ // true = server evaluation; hostname enables SNI matching
117
+
118
+ var trust: SecTrust?
119
+ SecTrustCreateWithCertificates(certificateChain as CFTypeRef, policy, &trust)
120
+ ```
121
+
122
+ ```swift
123
+ // ✅ CORRECT: Custom anchor while preserving system trust store
124
+ SecTrustSetAnchorCertificates(trust, [customRootCA] as CFArray)
125
+ SecTrustSetAnchorCertificatesOnly(trust, false) // false = ALSO trust system anchors
126
+ ```
127
+
128
+ ```swift
129
+ // ❌ INCORRECT: Missing SecTrustSetAnchorCertificatesOnly
130
+ SecTrustSetAnchorCertificates(trust, [customRootCA] as CFArray)
131
+ // Without SecTrustSetAnchorCertificatesOnly(trust, false), ALL system anchors
132
+ // are silently disabled — only your custom CA is trusted!
133
+ ```
134
+
135
+ ```swift
136
+ // ❌ INCORRECT: nil hostname disables hostname verification entirely
137
+ let policy = SecPolicyCreateSSL(true, nil)
138
+ // Any valid certificate for ANY domain now passes — MITM vector
139
+ ```
140
+
141
+ ---
142
+
143
+ ## Four Pinning Strategies
144
+
145
+ ### Leaf certificate pinning — breaks on every renewal
146
+
147
+ Commercial TLS certificates expire every 90 days (Let's Encrypt) to 398 days (CA/Browser Forum maximum). When the server renews, the certificate bytes change (new serial, validity dates, signature) and the pin breaks. Users are locked out until an App Store update ships.
148
+
149
+ ```swift
150
+ // ❌ DANGEROUS: Leaf pinning that breaks on every certificate renewal
151
+ guard let chain = SecTrustCopyCertificateChain(serverTrust) as? [SecCertificate],
152
+ let serverCert = chain.first else {
153
+ completionHandler(.cancelAuthenticationChallenge, nil)
154
+ return
155
+ }
156
+ let serverCertData = SecCertificateCopyData(serverCert) as Data
157
+ let localCertData = // loaded from bundle .cer file
158
+
159
+ if serverCertData == localCertData {
160
+ completionHandler(.useCredential, URLCredential(trust: serverTrust))
161
+ } else {
162
+ // WILL fire when the certificate renews, locking out all users
163
+ completionHandler(.cancelAuthenticationChallenge, nil)
164
+ }
165
+ ```
166
+
167
+ **Verdict**: never use in production unless you control the full certificate lifecycle AND can update pins without App Store review.
168
+
169
+ ### Intermediate CA pinning — 5–10 year validity window
170
+
171
+ Pin an intermediate CA certificate. Any leaf issued by that CA passes the check. The server can freely renew its leaf certificate.
172
+
173
+ ```swift
174
+ // ✅ CORRECT: Intermediate CA pinning (resilient to leaf renewal)
175
+ guard let chain = SecTrustCopyCertificateChain(serverTrust) as? [SecCertificate] else {
176
+ completionHandler(.cancelAuthenticationChallenge, nil)
177
+ return
178
+ }
179
+
180
+ let pinnedIntermediateData = // load intermediate CA .cer from bundle
181
+
182
+ for cert in chain {
183
+ let certData = SecCertificateCopyData(cert) as Data
184
+ if certData == pinnedIntermediateData {
185
+ completionHandler(.useCredential, URLCredential(trust: serverTrust))
186
+ return
187
+ }
188
+ }
189
+ completionHandler(.cancelAuthenticationChallenge, nil)
190
+ ```
191
+
192
+ **Tradeoff**: trusts any certificate from that CA, not just yours. If the CA is compromised, a same-CA certificate could impersonate your server.
193
+
194
+ ### SPKI hash pinning — survives renewal with same key pair
195
+
196
+ Hashes the SubjectPublicKeyInfo (SPKI) structure. When certificates renew **with the same key pair**, the SPKI stays identical. This is the **recommended programmatic approach**.
197
+
198
+ **Critical correctness issue**: `SecKeyCopyExternalRepresentation` returns raw key bytes **without** the ASN.1 SPKI header. You must prepend the correct header before hashing. Omitting this produces incorrect hashes that won't match pins generated via OpenSSL.
199
+
200
+ > ⚠️ **Cross-validation note**: The parallel research source omits the ASN.1 header prepend step and uses deprecated `SecTrustGetCertificateAtIndex`. The code below uses the correct modern APIs with proper SPKI construction.
201
+
202
+ ```swift
203
+ // ✅ CORRECT: SPKI hash pinning with ASN.1 header and modern APIs
204
+ class SPKIPinningDelegate: NSObject, URLSessionDelegate {
205
+
206
+ // ASN.1 headers for reconstructing SPKI from raw key data
207
+ private static let rsa2048Header: [UInt8] = [
208
+ 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,
209
+ 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00
210
+ ]
211
+ private static let ecP256Header: [UInt8] = [
212
+ 0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02,
213
+ 0x01, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, 0x03,
214
+ 0x42, 0x00
215
+ ]
216
+
217
+ private let pinnedHashes: Set<String> // Base64(SHA256(SPKI))
218
+
219
+ init(pinnedHashes: Set<String>) {
220
+ self.pinnedHashes = pinnedHashes
221
+ }
222
+
223
+ func urlSession(_ session: URLSession,
224
+ didReceive challenge: URLAuthenticationChallenge,
225
+ completionHandler: @escaping (URLSession.AuthChallengeDisposition,
226
+ URLCredential?) -> Void) {
227
+ guard challenge.protectionSpace.authenticationMethod
228
+ == NSURLAuthenticationMethodServerTrust,
229
+ let serverTrust = challenge.protectionSpace.serverTrust else {
230
+ completionHandler(.performDefaultHandling, nil)
231
+ return
232
+ }
233
+
234
+ // Step 1: ALWAYS validate the chain via system trust first
235
+ guard SecTrustEvaluateWithError(serverTrust, nil) else {
236
+ completionHandler(.cancelAuthenticationChallenge, nil)
237
+ return
238
+ }
239
+
240
+ // Step 2: Walk chain and check SPKI hashes
241
+ guard let chain = SecTrustCopyCertificateChain(serverTrust)
242
+ as? [SecCertificate] else {
243
+ completionHandler(.cancelAuthenticationChallenge, nil)
244
+ return
245
+ }
246
+
247
+ for cert in chain {
248
+ if let hash = spkiHash(for: cert), pinnedHashes.contains(hash) {
249
+ completionHandler(.useCredential, URLCredential(trust: serverTrust))
250
+ return
251
+ }
252
+ }
253
+ completionHandler(.cancelAuthenticationChallenge, nil)
254
+ }
255
+
256
+ private func spkiHash(for certificate: SecCertificate) -> String? {
257
+ guard let publicKey = SecCertificateCopyKey(certificate),
258
+ let keyData = SecKeyCopyExternalRepresentation(publicKey, nil) as Data?,
259
+ let attrs = SecKeyCopyAttributes(publicKey) as? [CFString: Any],
260
+ let keyType = attrs[kSecAttrKeyType] as? String,
261
+ let keySize = attrs[kSecAttrKeySizeInBits] as? Int else { return nil }
262
+
263
+ let header: [UInt8]
264
+ switch (keyType, keySize) {
265
+ case (kSecAttrKeyTypeRSA as String, 2048): header = Self.rsa2048Header
266
+ case (kSecAttrKeyTypeRSA as String, 4096):
267
+ // Add RSA-4096 header for production use
268
+ return nil
269
+ case (kSecAttrKeyTypeECSECPrimeRandom as String, 256):
270
+ header = Self.ecP256Header
271
+ default: return nil
272
+ }
273
+
274
+ var spki = Data(header)
275
+ spki.append(keyData)
276
+
277
+ var hash = [UInt8](repeating: 0, count: Int(CC_SHA256_DIGEST_LENGTH))
278
+ spki.withUnsafeBytes {
279
+ _ = CC_SHA256($0.baseAddress, CC_LONG(spki.count), &hash)
280
+ }
281
+ return Data(hash).base64EncodedString()
282
+ }
283
+ }
284
+ ```
285
+
286
+ Generate expected SPKI hashes from the command line:
287
+
288
+ ```bash
289
+ # From a PEM certificate file:
290
+ openssl x509 -in cert.pem -noout -pubkey | \
291
+ openssl pkey -pubin -outform der | \
292
+ openssl dgst -sha256 -binary | openssl enc -base64
293
+
294
+ # From a live server:
295
+ openssl s_client -connect api.example.com:443 </dev/null 2>/dev/null | \
296
+ openssl x509 -pubkey -noout | \
297
+ openssl pkey -pubin -outform der | \
298
+ openssl dgst -sha256 -binary | openssl enc -base64
299
+ ```
300
+
301
+ ### NSPinnedDomains — declarative pinning, zero code (iOS 14+)
302
+
303
+ Apple's recommended approach. Enforced automatically by `URLSession` via ATS. Uses SPKI hashes.
304
+
305
+ ```xml
306
+ <!-- ✅ CORRECT: CA identity pinning with backup pin via NSPinnedDomains -->
307
+ <key>NSAppTransportSecurity</key>
308
+ <dict>
309
+ <key>NSPinnedDomains</key>
310
+ <dict>
311
+ <key>api.example.com</key>
312
+ <dict>
313
+ <key>NSIncludesSubdomains</key>
314
+ <true/>
315
+ <key>NSPinnedCAIdentities</key>
316
+ <array>
317
+ <dict>
318
+ <key>SPKI-SHA256-BASE64</key>
319
+ <string>PrimaryCA_SPKI_Hash_Base64==</string>
320
+ </dict>
321
+ <dict>
322
+ <!-- Backup CA from a different provider -->
323
+ <key>SPKI-SHA256-BASE64</key>
324
+ <string>BackupCA_SPKI_Hash_Base64==</string>
325
+ </dict>
326
+ </array>
327
+ </dict>
328
+ </dict>
329
+ </dict>
330
+ ```
331
+
332
+ Available keys per pinned domain:
333
+
334
+ - **`NSPinnedCAIdentities`** — matches any intermediate or root in the chain (logical OR within array)
335
+ - **`NSPinnedLeafIdentities`** — matches the leaf certificate only
336
+ - **`NSIncludesSubdomains`** — covers first-level subdomains when `true`
337
+
338
+ If **both** `NSPinnedCAIdentities` and `NSPinnedLeafIdentities` are specified, ATS requires a match in **each** category (AND between categories, OR within each).
339
+
340
+ **Limitations**: works with `URLSession` and `WKWebView` (iOS 16+ after earlier bugs were fixed). Does not work with `SFSafariViewController`. Pins are visible in `Info.plist` and cannot be updated without an app update.
341
+
342
+ ### Pinning Strategy Decision Matrix
343
+
344
+ | Strategy | Resilience | Specificity | Update Frequency | Best For |
345
+ | ---------------- | --------------------------------- | -------------------------- | -------------------- | -------------------------------- |
346
+ | Leaf certificate | ❌ Breaks every 90–398 days | Highest — exact cert match | Every renewal | Never in production |
347
+ | Intermediate CA | ✅ 5–10 years | Medium — all certs from CA | Rarely | Single-CA-provider apps |
348
+ | SPKI hash (code) | ✅ Survives renewal with same key | High — specific key | Only on key rotation | Dynamic pinsets, custom logic |
349
+ | NSPinnedDomains | ✅ Survives renewal with same key | High — SPKI-based | Only on key rotation | **Default choice for most apps** |
350
+
351
+ ---
352
+
353
+ ## SecCertificate and SecIdentity
354
+
355
+ ### Creating certificates from DER data
356
+
357
+ ```swift
358
+ // ✅ CORRECT: Load .cer from app bundle
359
+ guard let certURL = Bundle.main.url(forResource: "server", withExtension: "cer"),
360
+ let certData = try? Data(contentsOf: certURL),
361
+ let certificate = SecCertificateCreateWithData(nil, certData as CFData) else {
362
+ fatalError("Failed to load certificate")
363
+ }
364
+
365
+ let summary = SecCertificateCopySubjectSummary(certificate) as String?
366
+ let publicKey = SecCertificateCopyKey(certificate) // iOS 12+
367
+ let derBytes = SecCertificateCopyData(certificate) as Data // Round-trip to DER
368
+ ```
369
+
370
+ `SecCertificateCreateWithData` accepts **DER-encoded** data only — not PEM. For PEM files, strip the `-----BEGIN CERTIFICATE-----` header/footer and Base64-decode.
371
+
372
+ ### Importing PKCS#12 for client certificate authentication
373
+
374
+ ```swift
375
+ // ✅ CORRECT: Import .p12 and extract SecIdentity
376
+ func importIdentity(from p12Data: Data, password: String) throws -> SecIdentity {
377
+ let options: [String: Any] = [kSecImportExportPassphrase as String: password]
378
+ var rawItems: CFArray?
379
+ let status = SecPKCS12Import(p12Data as CFData, options as CFDictionary, &rawItems)
380
+
381
+ guard status == errSecSuccess,
382
+ let items = rawItems as? [[String: Any]],
383
+ let firstItem = items.first,
384
+ let identity = firstItem[kSecImportItemIdentity as String] as? SecIdentity else {
385
+ throw NSError(domain: NSOSStatusErrorDomain, code: Int(status))
386
+ }
387
+ return identity
388
+ }
389
+ ```
390
+
391
+ Result dictionary keys from `SecPKCS12Import`:
392
+
393
+ - **`kSecImportItemIdentity`** (`SecIdentity`) — private key + certificate pair
394
+ - **`kSecImportItemCertChain`** (`[SecCertificate]`) — full certificate chain
395
+ - **`kSecImportItemTrust`** (`SecTrust`) — pre-configured trust object
396
+ - **`kSecImportItemKeyID`** (`Data`) — typically SHA-1 hash of public key
397
+
398
+ **Never bundle passwords with your app.** Prompt the user or read from the Keychain.
399
+
400
+ ### Client certificate authentication in URLSession
401
+
402
+ ```swift
403
+ // ✅ CORRECT: Mutual TLS delegate handling both server trust and client cert
404
+ class MutualTLSDelegate: NSObject, URLSessionDelegate {
405
+ private let identity: SecIdentity
406
+ private let certChain: [SecCertificate]?
407
+
408
+ init(identity: SecIdentity, certChain: [SecCertificate]? = nil) {
409
+ self.identity = identity
410
+ self.certChain = certChain
411
+ }
412
+
413
+ func urlSession(_ session: URLSession,
414
+ didReceive challenge: URLAuthenticationChallenge,
415
+ completionHandler: @escaping (URLSession.AuthChallengeDisposition,
416
+ URLCredential?) -> Void) {
417
+ switch challenge.protectionSpace.authenticationMethod {
418
+ case NSURLAuthenticationMethodClientCertificate:
419
+ let credential = URLCredential(
420
+ identity: identity,
421
+ certificates: certChain,
422
+ persistence: .forSession
423
+ )
424
+ completionHandler(.useCredential, credential)
425
+
426
+ case NSURLAuthenticationMethodServerTrust:
427
+ guard let trust = challenge.protectionSpace.serverTrust,
428
+ SecTrustEvaluateWithError(trust, nil) else {
429
+ completionHandler(.cancelAuthenticationChallenge, nil)
430
+ return
431
+ }
432
+ completionHandler(.useCredential, URLCredential(trust: trust))
433
+
434
+ default:
435
+ completionHandler(.performDefaultHandling, nil)
436
+ }
437
+ }
438
+ }
439
+ ```
440
+
441
+ Client certificate challenges are **session-wide** (`URLSessionDelegate`), not task-specific. Apps must manage certificates within their sandbox — they cannot access system-wide certificates installed via MDM.
442
+
443
+ ### Certificate chain inspection (backward-compatible)
444
+
445
+ ```swift
446
+ // ✅ CORRECT: Backward-compatible chain inspection
447
+ func certificateChain(from trust: SecTrust) -> [SecCertificate] {
448
+ if #available(iOS 15.0, macOS 12.0, *) {
449
+ return SecTrustCopyCertificateChain(trust) as? [SecCertificate] ?? []
450
+ } else {
451
+ return (0..<SecTrustGetCertificateCount(trust)).compactMap {
452
+ SecTrustGetCertificateAtIndex(trust, $0)
453
+ }
454
+ }
455
+ }
456
+ ```
457
+
458
+ ---
459
+
460
+ ## Anti-Patterns AI Code Generators Produce
461
+
462
+ | Anti-Pattern | Risk | Correct Replacement |
463
+ | ----------------------------------------------------------------------------- | ----------------------------------------------- | --------------------------------------------------------------------- |
464
+ | Using deprecated `SecTrustEvaluate` | No error context, deprecated iOS 13 | `SecTrustEvaluateWithError` or `SecTrustEvaluateAsyncWithError` |
465
+ | Disabling ATS globally | Enables trivial MITM, triggers App Store review | `NSAllowsLocalNetworking` for dev; targeted exceptions for production |
466
+ | `SecTrustSetAnchorCertificates` without `SetAnchorCertificatesOnly(_, false)` | Silently disables all system anchors | Always pair both calls |
467
+ | `SecPolicyCreateSSL` with `nil` hostname | Disables hostname verification — MITM vector | Always pass the actual expected hostname |
468
+ | Skipping system trust eval before pin checks | Expired/revoked certs pass pin checks | Always `SecTrustEvaluateWithError` first, then check pins |
469
+ | Using `SecTrustGetCertificateAtIndex` | Deprecated iOS 15 | `SecTrustCopyCertificateChain` (with backward-compat fallback) |
470
+ | Using `SecTrustCopyPublicKey` | Deprecated iOS 14 | `SecCertificateCopyKey` or `SecTrustCopyKey` |
471
+ | SPKI hashing without ASN.1 header | Produces wrong hash, pins never match | Prepend correct ASN.1 SPKI header before SHA-256 |
472
+ | Evaluating trust on `.main` queue | UI freezes during network-dependent checks | Always use background dispatch queue |
473
+
474
+ ```xml
475
+ <!-- ❌ DANGEROUS: Never ship this -->
476
+ <key>NSAppTransportSecurity</key>
477
+ <dict>
478
+ <key>NSAllowsArbitraryLoads</key>
479
+ <true/>
480
+ </dict>
481
+
482
+ <!-- ✅ CORRECT: Local networking only for development -->
483
+ <key>NSAppTransportSecurity</key>
484
+ <dict>
485
+ <key>NSAllowsLocalNetworking</key>
486
+ <true/>
487
+ </dict>
488
+ ```
489
+
490
+ ---
491
+
492
+ ## Backup Pins, Rotation, and Graceful Degradation
493
+
494
+ **Always include at least two pins.** A single pin means any certificate revocation, CA compromise, or unplanned key rotation bricks your app's networking.
495
+
496
+ **Backup strategy**: pre-generate a backup key pair, compute its SPKI hash, include it as a pin — without deploying the corresponding certificate. If the primary key is compromised, issue a certificate for the backup key server-side. The app already trusts it.
497
+
498
+ **When all pins fail**: display a clear error that server credentials could not be verified, switch to offline/cached mode, **never allow the user to bypass the pin**, log for diagnostics. Recovery requires an App Store update (consumer apps) or MDM profile update (managed deployments).
499
+
500
+ **OWASP's current nuanced position**: pinning should only be done when you control both client and server, can update the pinset securely, and have a clear rotation strategy. Certificate Transparency (enforced on Apple platforms since iOS 12.1.1) plus Apple's revocation infrastructure provides substantial protection without pinning's operational risk.
501
+
502
+ ---
503
+
504
+ ## ATS Interaction Points
505
+
506
+ ATS enforces TLS 1.2+, 2048-bit RSA or 256-bit ECC keys, SHA-256+ hashing, AES-128/256, and forward secrecy on all `URLSession` connections.
507
+
508
+ **iOS 17 change**: ATS now requires HTTPS for connections to bare IP addresses (not just domain names).
509
+
510
+ Keys that trigger additional App Store review: `NSAllowsArbitraryLoads`, `NSAllowsArbitraryLoadsForMedia`, `NSAllowsArbitraryLoadsInWebContent`, `NSExceptionAllowsInsecureHTTPLoads`, `NSExceptionMinimumTLSVersion`.
511
+
512
+ Use `nscurl --ats-diagnostics https://your-server.com` on macOS to diagnose ATS compatibility.
513
+
514
+ ---
515
+
516
+ ## API Deprecation Timeline
517
+
518
+ | OS Version | Year | Key Changes |
519
+ | -------------------- | ---- | -------------------------------------------------------------------------------------- |
520
+ | iOS 12 / macOS 10.14 | 2018 | `SecTrustEvaluateWithError` introduced; Certificate Transparency enforced (iOS 12.1.1) |
521
+ | iOS 13 / macOS 10.15 | 2019 | `SecTrustEvaluateAsyncWithError` introduced; `SecTrustEvaluate` deprecated |
522
+ | iOS 14 / macOS 11 | 2020 | **`NSPinnedDomains`** introduced; `SecTrustCopyKey` replaces `SecTrustCopyPublicKey` |
523
+ | iOS 15 / macOS 12 | 2021 | **`SecTrustCopyCertificateChain`** replaces `SecTrustGetCertificateAtIndex`/`Count` |
524
+ | iOS 17 / macOS 14 | 2023 | ATS enforced for IP addresses; EAP-TLS 1.3 support |
525
+ | iOS 18 / macOS 15 | 2024 | Swift 6 strict concurrency affects callback-based Security code; no new SecTrust APIs |
526
+
527
+ ---
528
+
529
+ ## Thread Safety and Performance
530
+
531
+ - SecTrust objects are thread-safe only **across different instances**. Never access the same `SecTrust` from multiple threads.
532
+ - Different `SecTrust` objects can be evaluated concurrently on different threads.
533
+ - On iOS, all Certificate/Key/Trust Services functions are thread-safe and reentrant.
534
+ - On macOS, trust evaluation can **block on user interaction** (keychain unlock dialogs) — always evaluate on background threads.
535
+ - `SecTrust`, `SecCertificate`, and `SecKey` are **not** marked `Sendable`. With Swift 6 strict concurrency, use `@unchecked Sendable` wrappers or explicit actor isolation.
536
+
537
+ ---
538
+
539
+ ## CI/CD Guardrails
540
+
541
+ - **Fail builds** if `NSAllowsArbitraryLoads` is `true` in production `Info.plist`.
542
+ - **Validate** that `SecPolicyCreateSSL` is never called with a `nil` hostname in production code paths.
543
+ - **Enforce** that any `NSPinnedDomains` entry contains at least two SPKI hashes (backup pin requirement).
544
+ - **Scan** for deprecated APIs: `SecTrustEvaluate(`, `SecTrustGetCertificateAtIndex(`, `SecTrustCopyPublicKey(`.
545
+ - **Test** pinning with certificate rotation in staging before production deployment.
546
+
547
+ ---
548
+
549
+ ## Cross-Validation Notes
550
+
551
+ Both research sources agree on all major recommendations. Key discrepancies in the parallel source (corrected in this file):
552
+
553
+ 1. **Deprecated API in code example**: Parallel source uses `SecTrustGetCertificateAtIndex(trust, 0)` — deprecated iOS 15. Corrected to `SecTrustCopyCertificateChain`.
554
+ 2. **Missing ASN.1 header**: Parallel source hashes raw key bytes without prepending the SPKI ASN.1 header, producing incorrect hashes. Corrected with explicit header prepend.
555
+ 3. **Deprecated `SecTrustCopyPublicKey` reference**: Parallel source references this API — deprecated iOS 14. Corrected to `SecCertificateCopyKey`.
556
+ 4. **Main queue evaluation**: Parallel source evaluates on `.main` queue. Corrected to background queue.
557
+
558
+ ---
559
+
560
+ ## Cross-References
561
+
562
+ - `keychain-item-classes.md` — `kSecClassCertificate` and `kSecClassIdentity` storage, PKCS#12 import patterns
563
+ - `keychain-fundamentals.md` — SecItem CRUD patterns for certificate and identity persistence
564
+ - `cryptokit-public-key.md` — PEM/DER key interoperability, curve selection for client certificates
565
+ - `compliance-owasp-mapping.md` — M5 (Insecure Communication) trust evaluation requirements
566
+
567
+ ---
568
+
569
+ ## WWDC and Reference Citations
570
+
571
+ - **WWDC 2017 Session 709** — "Your Apps and Evolving Network Security Standards" (ATS, CT, pinning guidance)
572
+ - **Apple Developer Documentation** — "Evaluating a Trust and Parsing the Result", `SecTrustEvaluateAsyncWithError`, `NSPinnedDomains`
573
+ - **Apple Platform Security Guide** — Revocation infrastructure, Certificate Transparency
574
+ - **Apple News Article** — "Identity Pinning: How to configure server certificates for your app"
575
+ - **OWASP Pinning Cheat Sheet** — Strategy recommendations, backup pin guidance
576
+ - **OWASP MASTG** — Certificate pinning test cases
577
+
578
+ ---
579
+
580
+ ## Summary Checklist
581
+
582
+ 1. **Trust evaluation uses modern API** — `SecTrustEvaluateWithError` (sync) or `SecTrustEvaluateAsyncWithError` (async); no deprecated `SecTrustEvaluate`
583
+ 2. **Trust evaluation runs off main thread** — background dispatch queue for async; URLSession delegate callbacks already off-main for sync
584
+ 3. **Pinning strategy avoids leaf certificates** — use SPKI hash pinning, intermediate CA pinning, or `NSPinnedDomains`; never pin raw leaf certificate bytes in production
585
+ 4. **At least two pins configured** — primary + backup from different CA or pre-generated backup key pair
586
+ 5. **System trust evaluated before pin checks** — always call `SecTrustEvaluateWithError` first, then compare SPKI hashes; never skip chain validation
587
+ 6. **SPKI hashing includes ASN.1 header** — prepend correct algorithm-specific header before SHA-256 hashing raw key bytes from `SecKeyCopyExternalRepresentation`
588
+ 7. **Custom anchors preserve system trust** — `SecTrustSetAnchorCertificates` paired with `SecTrustSetAnchorCertificatesOnly(_, false)` unless intentionally restricting
589
+ 8. **SSL policy binds hostname** — `SecPolicyCreateSSL` always receives actual expected hostname, never `nil`
590
+ 9. **ATS not globally disabled** — no `NSAllowsArbitraryLoads: true` in production; use targeted exceptions (`NSAllowsLocalNetworking`, per-domain exceptions)
591
+ 10. **Chain inspection uses current APIs** — `SecTrustCopyCertificateChain` (iOS 15+) with fallback to `SecTrustGetCertificateAtIndex` for older targets; `SecCertificateCopyKey` not `SecTrustCopyPublicKey`
592
+ 11. **Client certificate passwords not bundled** — PKCS#12 passwords prompted at runtime or stored in Keychain, never hardcoded or embedded in app bundle