@mmerterden/multi-agent-pipeline 20.7.0 → 20.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +9 -0
- package/LICENSE +0 -10
- package/docs/facts.json +1 -1
- package/manifest.json +266 -267
- package/package.json +2 -2
- package/pipeline/scripts/_notices.mjs +1 -1
- package/pipeline/skills/.skill-manifest.json +68 -68
- package/pipeline/skills/shared/README.md +70 -70
- package/pipeline/skills/shared/external/alarmkit/SKILL.md +373 -381
- package/pipeline/skills/shared/external/alarmkit/evals/evals.json +23 -18
- package/pipeline/skills/shared/external/alarmkit/references/alarmkit-patterns.md +328 -378
- package/pipeline/skills/shared/external/app-clips/SKILL.md +260 -160
- package/pipeline/skills/shared/external/app-clips/evals/evals.json +27 -27
- package/pipeline/skills/shared/external/app-clips/references/data-handoff-notifications-location.md +150 -83
- package/pipeline/skills/shared/external/app-clips/references/routing-and-experiences.md +135 -83
- package/pipeline/skills/shared/external/app-clips/references/size-capabilities-and-promotion.md +143 -85
- package/pipeline/skills/shared/external/app-intents/SKILL.md +302 -304
- package/pipeline/skills/shared/external/app-intents/evals/evals.json +21 -21
- package/pipeline/skills/shared/external/app-intents/references/appintents-advanced.md +594 -894
- package/pipeline/skills/shared/external/app-store-optimization/SKILL.md +339 -277
- package/pipeline/skills/shared/external/app-store-optimization/evals/evals.json +27 -23
- package/pipeline/skills/shared/external/app-store-optimization/references/keyword-research-methodology.md +105 -122
- package/pipeline/skills/shared/external/app-store-optimization/references/product-page-variants.md +143 -166
- package/pipeline/skills/shared/external/app-store-review/SKILL.md +307 -326
- package/pipeline/skills/shared/external/app-store-review/evals/evals.json +21 -21
- package/pipeline/skills/shared/external/app-store-review/references/privacy-manifest.md +105 -67
- package/pipeline/skills/shared/external/app-store-review/references/review-checklists.md +114 -101
- package/pipeline/skills/shared/external/apple-on-device-ai/SKILL.md +333 -360
- package/pipeline/skills/shared/external/apple-on-device-ai/evals/evals.json +24 -27
- package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-conversion.md +215 -322
- package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-optimization.md +161 -256
- package/pipeline/skills/shared/external/apple-on-device-ai/references/foundation-models.md +277 -387
- package/pipeline/skills/shared/external/apple-on-device-ai/references/mlx-swift.md +196 -210
- package/pipeline/skills/shared/external/authentication/SKILL.md +265 -381
- package/pipeline/skills/shared/external/authentication/evals/evals.json +25 -25
- package/pipeline/skills/shared/external/authentication/references/keychain-biometric.md +133 -178
- package/pipeline/skills/shared/external/authentication/references/passkeys.md +111 -147
- package/pipeline/skills/shared/external/avkit/SKILL.md +267 -364
- package/pipeline/skills/shared/external/avkit/evals/evals.json +26 -26
- package/pipeline/skills/shared/external/avkit/references/avkit-patterns.md +375 -493
- package/pipeline/skills/shared/external/background-processing/SKILL.md +270 -382
- package/pipeline/skills/shared/external/background-processing/evals/evals.json +22 -22
- package/pipeline/skills/shared/external/background-processing/references/background-task-patterns.md +169 -317
- package/pipeline/skills/shared/external/callkit-voip/SKILL.md +290 -371
- package/pipeline/skills/shared/external/callkit-voip/evals/evals.json +24 -24
- package/pipeline/skills/shared/external/callkit-voip/references/callkit-patterns.md +175 -343
- package/pipeline/skills/shared/external/cloudkit-sync/SKILL.md +292 -381
- package/pipeline/skills/shared/external/cloudkit-sync/evals/evals.json +33 -30
- package/pipeline/skills/shared/external/cloudkit-sync/references/cloudkit-patterns.md +227 -355
- package/pipeline/skills/shared/external/contacts-framework/SKILL.md +197 -346
- package/pipeline/skills/shared/external/contacts-framework/evals/evals.json +19 -21
- package/pipeline/skills/shared/external/contacts-framework/references/contacts-patterns.md +169 -308
- package/pipeline/skills/shared/external/core-bluetooth/SKILL.md +226 -376
- package/pipeline/skills/shared/external/core-bluetooth/evals/evals.json +25 -22
- package/pipeline/skills/shared/external/core-bluetooth/references/ble-patterns.md +257 -337
- package/pipeline/skills/shared/external/core-data/SKILL.md +292 -368
- package/pipeline/skills/shared/external/core-data/evals/evals.json +30 -27
- package/pipeline/skills/shared/external/core-motion/SKILL.md +235 -324
- package/pipeline/skills/shared/external/core-motion/evals/evals.json +31 -27
- package/pipeline/skills/shared/external/core-motion/references/motion-patterns.md +210 -310
- package/pipeline/skills/shared/external/core-nfc/SKILL.md +292 -366
- package/pipeline/skills/shared/external/core-nfc/evals/evals.json +22 -24
- package/pipeline/skills/shared/external/core-nfc/references/nfc-patterns.md +233 -329
- package/pipeline/skills/shared/external/coreml/SKILL.md +323 -367
- package/pipeline/skills/shared/external/coreml/evals/evals.json +24 -21
- package/pipeline/skills/shared/external/coreml/references/coreml-swift-integration.md +562 -565
- package/pipeline/skills/shared/external/cryptokit/SKILL.md +253 -394
- package/pipeline/skills/shared/external/cryptokit/evals/evals.json +20 -18
- package/pipeline/skills/shared/external/cryptokit/references/cryptokit-patterns.md +299 -488
- package/pipeline/skills/shared/external/debugging-instruments/SKILL.md +270 -323
- package/pipeline/skills/shared/external/debugging-instruments/evals/evals.json +27 -30
- package/pipeline/skills/shared/external/debugging-instruments/references/instruments-guide.md +167 -315
- package/pipeline/skills/shared/external/debugging-instruments/references/lldb-patterns.md +140 -193
- package/pipeline/skills/shared/external/device-integrity/SKILL.md +230 -353
- package/pipeline/skills/shared/external/device-integrity/evals/evals.json +25 -21
- package/pipeline/skills/shared/external/device-integrity/references/device-integrity-patterns.md +159 -197
- package/pipeline/skills/shared/external/energykit/SKILL.md +225 -392
- package/pipeline/skills/shared/external/energykit/evals/evals.json +29 -28
- package/pipeline/skills/shared/external/energykit/references/energykit-patterns.md +174 -470
- package/pipeline/skills/shared/external/eventkit-calendar/SKILL.md +261 -383
- package/pipeline/skills/shared/external/eventkit-calendar/evals/evals.json +25 -22
- package/pipeline/skills/shared/external/eventkit-calendar/references/eventkit-patterns.md +165 -268
- package/pipeline/skills/shared/external/healthkit/SKILL.md +252 -303
- package/pipeline/skills/shared/external/healthkit/evals/evals.json +24 -23
- package/pipeline/skills/shared/external/healthkit/references/healthkit-patterns.md +369 -523
- package/pipeline/skills/shared/external/homekit-matter/SKILL.md +233 -348
- package/pipeline/skills/shared/external/homekit-matter/evals/evals.json +27 -22
- package/pipeline/skills/shared/external/homekit-matter/references/matter-commissioning.md +199 -305
- package/pipeline/skills/shared/external/ios-accessibility/SKILL.md +368 -340
- package/pipeline/skills/shared/external/ios-accessibility/evals/evals.json +28 -27
- package/pipeline/skills/shared/external/ios-accessibility/references/a11y-patterns.md +314 -260
- package/pipeline/skills/shared/external/ios-accessibility/references/media-accessibility.md +97 -67
- package/pipeline/skills/shared/external/ios-accessibility/references/nutrition-labels.md +165 -101
- package/pipeline/skills/shared/external/ios-localization/SKILL.md +258 -371
- package/pipeline/skills/shared/external/ios-localization/evals/evals.json +23 -23
- package/pipeline/skills/shared/external/ios-localization/references/formatstyle-locale.md +283 -491
- package/pipeline/skills/shared/external/ios-localization/references/string-catalogs.md +313 -440
- package/pipeline/skills/shared/external/ios-networking/SKILL.md +265 -341
- package/pipeline/skills/shared/external/ios-networking/evals/evals.json +24 -24
- package/pipeline/skills/shared/external/ios-networking/references/background-websocket.md +425 -652
- package/pipeline/skills/shared/external/ios-networking/references/file-storage-patterns.md +143 -285
- package/pipeline/skills/shared/external/ios-networking/references/lightweight-clients.md +93 -53
- package/pipeline/skills/shared/external/ios-networking/references/network-framework.md +231 -456
- package/pipeline/skills/shared/external/ios-networking/references/urlsession-patterns.md +517 -784
- package/pipeline/skills/shared/external/ios-simulator/SKILL.md +265 -393
- package/pipeline/skills/shared/external/ios-simulator/evals/evals.json +21 -21
- package/pipeline/skills/shared/external/ios-simulator/references/simctl-commands.md +177 -270
- package/pipeline/skills/shared/external/live-activities/SKILL.md +318 -360
- package/pipeline/skills/shared/external/live-activities/evals/evals.json +21 -21
- package/pipeline/skills/shared/external/live-activities/references/activitykit-patterns.md +478 -710
- package/pipeline/skills/shared/external/mapkit-location/SKILL.md +295 -267
- package/pipeline/skills/shared/external/mapkit-location/evals/evals.json +28 -24
- package/pipeline/skills/shared/external/mapkit-location/references/mapkit-corelocation-patterns.md +378 -532
- package/pipeline/skills/shared/external/mapkit-location/references/mapkit-patterns.md +397 -499
- package/pipeline/skills/shared/external/metrickit-diagnostics/SKILL.md +165 -348
- package/pipeline/skills/shared/external/metrickit-diagnostics/evals/evals.json +26 -23
- package/pipeline/skills/shared/external/metrickit-diagnostics/references/metrickit-patterns.md +123 -130
- package/pipeline/skills/shared/external/musickit-audio/SKILL.md +189 -315
- package/pipeline/skills/shared/external/musickit-audio/evals/evals.json +22 -21
- package/pipeline/skills/shared/external/musickit-audio/references/musickit-patterns.md +181 -270
- package/pipeline/skills/shared/external/natural-language/SKILL.md +188 -340
- package/pipeline/skills/shared/external/natural-language/evals/evals.json +21 -21
- package/pipeline/skills/shared/external/natural-language/references/translation-patterns.md +171 -225
- package/pipeline/skills/shared/external/passkit-wallet/SKILL.md +258 -392
- package/pipeline/skills/shared/external/passkit-wallet/evals/evals.json +30 -29
- package/pipeline/skills/shared/external/passkit-wallet/references/wallet-passes.md +164 -231
- package/pipeline/skills/shared/external/pdfkit/SKILL.md +312 -344
- package/pipeline/skills/shared/external/pdfkit/evals/evals.json +19 -19
- package/pipeline/skills/shared/external/pdfkit/references/pdfkit-patterns.md +413 -624
- package/pipeline/skills/shared/external/pencilkit-drawing/SKILL.md +242 -358
- package/pipeline/skills/shared/external/pencilkit-drawing/evals/evals.json +25 -21
- package/pipeline/skills/shared/external/pencilkit-drawing/references/pencilkit-patterns.md +161 -226
- package/pipeline/skills/shared/external/permissionkit/SKILL.md +282 -400
- package/pipeline/skills/shared/external/permissionkit/evals/evals.json +27 -30
- package/pipeline/skills/shared/external/permissionkit/references/permissionkit-patterns.md +237 -350
- package/pipeline/skills/shared/external/photos-camera-media/SKILL.md +276 -325
- package/pipeline/skills/shared/external/photos-camera-media/references/av-playback.md +299 -545
- package/pipeline/skills/shared/external/photos-camera-media/references/camera-capture.md +344 -588
- package/pipeline/skills/shared/external/photos-camera-media/references/image-loading-caching.md +316 -660
- package/pipeline/skills/shared/external/photos-camera-media/references/photokit-patterns.md +270 -416
- package/pipeline/skills/shared/external/push-notifications/SKILL.md +312 -340
- package/pipeline/skills/shared/external/push-notifications/evals/evals.json +27 -26
- package/pipeline/skills/shared/external/push-notifications/references/notification-patterns.md +328 -485
- package/pipeline/skills/shared/external/push-notifications/references/rich-notifications.md +327 -560
- package/pipeline/skills/shared/external/realitykit-ar/SKILL.md +218 -410
- package/pipeline/skills/shared/external/realitykit-ar/evals/evals.json +24 -27
- package/pipeline/skills/shared/external/realitykit-ar/references/realitykit-patterns.md +221 -348
- package/pipeline/skills/shared/external/shareplay-activities/SKILL.md +222 -393
- package/pipeline/skills/shared/external/shareplay-activities/evals/evals.json +23 -24
- package/pipeline/skills/shared/external/shareplay-activities/references/shareplay-patterns.md +280 -420
- package/pipeline/skills/shared/external/speech-recognition/SKILL.md +217 -421
- package/pipeline/skills/shared/external/speech-recognition/evals/evals.json +23 -26
- package/pipeline/skills/shared/external/speech-recognition/references/speechanalyzer-patterns.md +133 -125
- package/pipeline/skills/shared/external/storekit/SKILL.md +228 -204
- package/pipeline/skills/shared/external/storekit/evals/evals.json +27 -24
- package/pipeline/skills/shared/external/storekit/references/app-review-guidelines.md +98 -109
- package/pipeline/skills/shared/external/storekit/references/core-patterns.md +298 -242
- package/pipeline/skills/shared/external/storekit/references/storekit-advanced.md +356 -649
- package/pipeline/skills/shared/external/swift-api-design-guidelines/SKILL.md +274 -399
- package/pipeline/skills/shared/external/swift-api-design-guidelines/evals/evals.json +22 -24
- package/pipeline/skills/shared/external/swift-api-design-guidelines/references/argument-labels-and-parameters.md +107 -108
- package/pipeline/skills/shared/external/swift-api-design-guidelines/references/conventions-and-special-rules.md +93 -165
- package/pipeline/skills/shared/external/swift-api-design-guidelines/references/naming-and-clarity.md +99 -137
- package/pipeline/skills/shared/external/swift-api-design-guidelines/references/side-effects-and-mutating-pairs.md +77 -120
- package/pipeline/skills/shared/external/swift-architecture/SKILL.md +334 -350
- package/pipeline/skills/shared/external/swift-architecture/evals/evals.json +22 -22
- package/pipeline/skills/shared/external/swift-charts/SKILL.md +208 -394
- package/pipeline/skills/shared/external/swift-charts/evals/evals.json +27 -30
- package/pipeline/skills/shared/external/swift-charts/references/charts-patterns.md +351 -762
- package/pipeline/skills/shared/external/swift-codable/SKILL.md +339 -343
- package/pipeline/skills/shared/external/swift-codable/evals/evals.json +20 -20
- package/pipeline/skills/shared/external/swift-concurrency/SKILL.md +303 -351
- package/pipeline/skills/shared/external/swift-concurrency/evals/evals.json +27 -24
- package/pipeline/skills/shared/external/swift-concurrency/references/approachable-concurrency.md +65 -80
- package/pipeline/skills/shared/external/swift-concurrency/references/async-algorithms.md +48 -84
- package/pipeline/skills/shared/external/swift-concurrency/references/bridging-interop.md +134 -79
- package/pipeline/skills/shared/external/swift-concurrency/references/concurrency-patterns.md +145 -167
- package/pipeline/skills/shared/external/swift-concurrency/references/diagnostics.md +62 -50
- package/pipeline/skills/shared/external/swift-concurrency/references/swiftui-concurrency.md +92 -121
- package/pipeline/skills/shared/external/swift-concurrency/references/synchronization-primitives.md +177 -241
- package/pipeline/skills/shared/external/swift-formatstyle/SKILL.md +258 -234
- package/pipeline/skills/shared/external/swift-language/SKILL.md +342 -382
- package/pipeline/skills/shared/external/swift-language/evals/evals.json +24 -27
- package/pipeline/skills/shared/external/swift-language/references/swift-attributes-interop.md +79 -56
- package/pipeline/skills/shared/external/swift-language/references/swift-patterns-extended.md +297 -340
- package/pipeline/skills/shared/external/swift-security/SKILL.md +180 -161
- package/pipeline/skills/shared/external/swift-security/evals/evals.json +25 -25
- package/pipeline/skills/shared/external/swift-security/references/biometric-authentication.md +314 -469
- package/pipeline/skills/shared/external/swift-security/references/certificate-trust.md +408 -476
- package/pipeline/skills/shared/external/swift-security/references/common-anti-patterns.md +260 -530
- package/pipeline/skills/shared/external/swift-security/references/compliance-owasp-mapping.md +270 -477
- package/pipeline/skills/shared/external/swift-security/references/credential-storage-patterns.md +573 -571
- package/pipeline/skills/shared/external/swift-security/references/cryptokit-public-key.md +370 -441
- package/pipeline/skills/shared/external/swift-security/references/cryptokit-symmetric.md +332 -433
- package/pipeline/skills/shared/external/swift-security/references/keychain-access-control.md +346 -468
- package/pipeline/skills/shared/external/swift-security/references/keychain-fundamentals.md +352 -472
- package/pipeline/skills/shared/external/swift-security/references/keychain-item-classes.md +431 -432
- package/pipeline/skills/shared/external/swift-security/references/keychain-sharing.md +328 -425
- package/pipeline/skills/shared/external/swift-security/references/migration-legacy-stores.md +341 -579
- package/pipeline/skills/shared/external/swift-security/references/secure-enclave.md +396 -457
- package/pipeline/skills/shared/external/swift-security/references/testing-security-code.md +354 -614
- package/pipeline/skills/shared/external/swift-testing/SKILL.md +188 -175
- package/pipeline/skills/shared/external/swift-testing/evals/evals.json +26 -24
- package/pipeline/skills/shared/external/swift-testing/references/testing-advanced.md +80 -84
- package/pipeline/skills/shared/external/swift-testing/references/testing-patterns.md +317 -433
- package/pipeline/skills/shared/external/swiftdata/SKILL.md +392 -256
- package/pipeline/skills/shared/external/swiftdata/evals/evals.json +24 -24
- package/pipeline/skills/shared/external/swiftdata/references/core-data-coexistence.md +206 -402
- package/pipeline/skills/shared/external/swiftdata/references/indexing.md +59 -52
- package/pipeline/skills/shared/external/swiftdata/references/predicate-pitfalls.md +57 -33
- package/pipeline/skills/shared/external/swiftdata/references/swiftdata-advanced.md +354 -747
- package/pipeline/skills/shared/external/swiftdata/references/swiftdata-queries.md +300 -508
- package/pipeline/skills/shared/external/swiftlint/SKILL.md +175 -226
- package/pipeline/skills/shared/external/swiftlint/references/adoption-and-configuration.md +141 -208
- package/pipeline/skills/shared/external/swiftlint/references/custom-rules-and-analyze.md +100 -109
- package/pipeline/skills/shared/external/swiftlint/references/plugins-run-scripts-and-integrations.md +159 -179
- package/pipeline/skills/shared/external/swiftlint/references/rule-reference.md +383 -18
- package/pipeline/skills/shared/external/swiftlint/references/rules-suppressions-and-baselines.md +143 -229
- package/pipeline/skills/shared/external/swiftui-animation/SKILL.md +283 -366
- package/pipeline/skills/shared/external/swiftui-animation/references/animation-advanced.md +396 -608
- package/pipeline/skills/shared/external/swiftui-animation/references/core-animation-bridge.md +336 -385
- package/pipeline/skills/shared/external/swiftui-gestures/SKILL.md +239 -349
- package/pipeline/skills/shared/external/swiftui-gestures/references/gesture-patterns.md +228 -310
- package/pipeline/skills/shared/external/swiftui-layout-components/SKILL.md +260 -249
- package/pipeline/skills/shared/external/swiftui-layout-components/references/form.md +92 -74
- package/pipeline/skills/shared/external/swiftui-layout-components/references/grids.md +112 -177
- package/pipeline/skills/shared/external/swiftui-layout-components/references/list.md +61 -64
- package/pipeline/skills/shared/external/swiftui-layout-components/references/scrollview.md +94 -134
- package/pipeline/skills/shared/external/swiftui-liquid-glass/SKILL.md +193 -225
- package/pipeline/skills/shared/external/swiftui-liquid-glass/references/liquid-glass.md +173 -327
- package/pipeline/skills/shared/external/swiftui-navigation/SKILL.md +193 -168
- package/pipeline/skills/shared/external/swiftui-navigation/references/deeplinks.md +127 -150
- package/pipeline/skills/shared/external/swiftui-navigation/references/navigationstack.md +132 -133
- package/pipeline/skills/shared/external/swiftui-navigation/references/sheets.md +152 -117
- package/pipeline/skills/shared/external/swiftui-navigation/references/tabview.md +106 -140
- package/pipeline/skills/shared/external/swiftui-patterns/SKILL.md +316 -252
- package/pipeline/skills/shared/external/swiftui-patterns/references/architecture-patterns.md +341 -332
- package/pipeline/skills/shared/external/swiftui-patterns/references/deprecated-migration.md +547 -854
- package/pipeline/skills/shared/external/swiftui-patterns/references/design-polish.md +485 -537
- package/pipeline/skills/shared/external/swiftui-patterns/references/platform-and-sharing.md +417 -499
- package/pipeline/skills/shared/external/swiftui-performance/SKILL.md +213 -376
- package/pipeline/skills/shared/external/swiftui-performance/references/demystify-swiftui-performance-wwdc23.md +86 -175
- package/pipeline/skills/shared/external/swiftui-performance/references/optimizing-swiftui-performance-instruments.md +89 -195
- package/pipeline/skills/shared/external/swiftui-performance/references/understanding-hangs-in-your-app.md +95 -182
- package/pipeline/skills/shared/external/swiftui-performance/references/understanding-improving-swiftui-performance.md +71 -149
- package/pipeline/skills/shared/external/swiftui-performance/references/wwdc-session-sources.md +21 -27
- package/pipeline/skills/shared/external/swiftui-uikit-interop/SKILL.md +303 -295
- package/pipeline/skills/shared/external/swiftui-uikit-interop/references/hosting-migration.md +204 -387
- package/pipeline/skills/shared/external/swiftui-uikit-interop/references/representable-recipes.md +469 -683
- package/pipeline/skills/shared/external/swiftui-webkit/SKILL.md +140 -186
- package/pipeline/skills/shared/external/swiftui-webkit/references/loading-and-observation.md +75 -86
- package/pipeline/skills/shared/external/swiftui-webkit/references/local-content-and-custom-schemes.md +63 -60
- package/pipeline/skills/shared/external/swiftui-webkit/references/migration-and-fallbacks.md +69 -137
- package/pipeline/skills/shared/external/swiftui-webkit/references/navigation-and-javascript.md +95 -67
- package/pipeline/skills/shared/external/tipkit/SKILL.md +220 -335
- package/pipeline/skills/shared/external/tipkit/references/tipkit-patterns.md +356 -494
- package/pipeline/skills/shared/external/vision-framework/SKILL.md +260 -375
- package/pipeline/skills/shared/external/vision-framework/references/vision-requests.md +393 -515
- package/pipeline/skills/shared/external/vision-framework/references/visionkit-scanner.md +363 -539
- package/pipeline/skills/shared/external/weatherkit/SKILL.md +152 -310
- package/pipeline/skills/shared/external/weatherkit/references/weatherkit-patterns.md +288 -407
- package/pipeline/skills/shared/external/widgetkit/SKILL.md +216 -288
- package/pipeline/skills/shared/external/widgetkit/references/widgetkit-advanced.md +414 -719
- package/pipeline/skills/shared/external/NOTICE-swift-ios-skills.md +0 -39
package/pipeline/skills/shared/external/swift-concurrency/references/concurrency-patterns.md
CHANGED
|
@@ -1,244 +1,222 @@
|
|
|
1
|
-
# Concurrency Patterns
|
|
1
|
+
# Approachable Concurrency Patterns
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
Swift 6.2 lets a target start out effectively single-threaded: with both
|
|
4
|
+
Default Actor Isolation set to `MainActor` and Approachable Concurrency turned
|
|
5
|
+
on, code runs on the main actor until you introduce parallelism deliberately.
|
|
6
|
+
Either setting alone gives only part of that picture.
|
|
5
7
|
|
|
6
|
-
##
|
|
8
|
+
## What problem 6.2 fixed
|
|
7
9
|
|
|
8
|
-
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
- [Isolated Conformances](#isolated-conformances)
|
|
14
|
-
- [SE-0481: weak let](#se-0481-weak-let)
|
|
15
|
-
- [SE-0475: Transactional Observation (Observations)](#se-0475-transactional-observation-observations)
|
|
16
|
-
- [Global and Static State](#global-and-static-state)
|
|
17
|
-
- [Migration and Build Settings](#migration-and-build-settings)
|
|
18
|
-
- [Summary](#summary)
|
|
19
|
-
|
|
20
|
-
## Core Problem Solved
|
|
21
|
-
|
|
22
|
-
In Swift 6.0/6.1, data-race safety was enforced at compile time, but the most
|
|
23
|
-
natural code to write often produced data-race errors. Async functions on types
|
|
24
|
-
with mutable state would implicitly hop to the global concurrent executor,
|
|
25
|
-
causing send-safety violations even when no actual parallelism was intended.
|
|
10
|
+
Swift 6.0 and 6.1 already enforced data-race safety at compile time, but
|
|
11
|
+
straightforward code tripped it. An async method on a type with mutable state
|
|
12
|
+
left the caller's actor and ran on the global concurrent executor, so passing
|
|
13
|
+
state into it counted as sending across isolation even though nobody wanted
|
|
14
|
+
parallel execution.
|
|
26
15
|
|
|
27
16
|
```swift
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
func
|
|
17
|
+
final class WaveformRenderer {
|
|
18
|
+
var sampleRate = 44_100.0
|
|
19
|
+
func render(_ audio: Data) async -> Waveform { Waveform(samples: []) }
|
|
31
20
|
}
|
|
32
21
|
|
|
33
22
|
@MainActor
|
|
34
|
-
final class
|
|
35
|
-
let
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
23
|
+
final class EpisodeDetailModel {
|
|
24
|
+
let renderer = WaveformRenderer()
|
|
25
|
+
var waveform: Waveform?
|
|
26
|
+
|
|
27
|
+
func refresh(with audio: Data) async {
|
|
28
|
+
waveform = await renderer.render(audio)
|
|
29
|
+
// Swift 6.0 / 6.1: error: sending 'self.renderer' risks causing data races
|
|
30
|
+
// Swift 6.2 with NonisolatedNonsendingByDefault: compiles, render runs on the main actor
|
|
41
31
|
}
|
|
42
32
|
}
|
|
43
33
|
```
|
|
44
34
|
|
|
45
|
-
|
|
46
|
-
// Swift 6.2: The same code compiles without error
|
|
47
|
-
// because extractSticker stays on the caller's actor
|
|
48
|
-
class PhotoProcessor {
|
|
49
|
-
func extractSticker(data: Data, with id: String?) async -> Sticker? { /* ... */ }
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
@MainActor
|
|
53
|
-
final class StickerModel {
|
|
54
|
-
let photoProcessor = PhotoProcessor()
|
|
55
|
-
|
|
56
|
-
func extractSticker(_ item: PhotosPickerItem) async throws -> Sticker? {
|
|
57
|
-
guard let data = try await item.loadTransferable(type: Data.self) else { return nil }
|
|
58
|
-
return await photoProcessor.extractSticker(data: data, with: item.itemIdentifier)
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
```
|
|
35
|
+
## Default MainActor isolation (SE-0466)
|
|
62
36
|
|
|
63
|
-
|
|
37
|
+
Enable it with one of:
|
|
64
38
|
|
|
65
|
-
|
|
66
|
-
`.defaultIsolation(MainActor.self)
|
|
67
|
-
|
|
39
|
+
- `-default-isolation MainActor` passed to the compiler,
|
|
40
|
+
- `.defaultIsolation(MainActor.self)` in a SwiftPM target's `swiftSettings`,
|
|
41
|
+
- Xcode build setting `Default Actor Isolation` = `MainActor`.
|
|
68
42
|
|
|
69
|
-
|
|
70
|
-
enables a bundle of upcoming
|
|
71
|
-
|
|
72
|
-
global-actor usability changes.
|
|
43
|
+
This is a different switch from Xcode's `Approachable Concurrency` setting. That
|
|
44
|
+
one enables a bundle of upcoming features: `NonisolatedNonsendingByDefault`,
|
|
45
|
+
inference of isolated conformances, `Sendable` inference for captures, and
|
|
46
|
+
smaller global-actor usability changes. In Swift 6 language mode some of those
|
|
47
|
+
are already on, so the setting mainly adds the first two.
|
|
73
48
|
|
|
74
|
-
|
|
75
|
-
- Unannotated declarations in the module are inferred as `@MainActor` unless
|
|
76
|
-
opted out.
|
|
77
|
-
- Global and static variables are protected by the main actor by default.
|
|
78
|
-
- Protocol conformances are implicitly isolated to `@MainActor`.
|
|
79
|
-
- Eliminates most annotation burden for single-threaded UI code.
|
|
49
|
+
With default isolation on:
|
|
80
50
|
|
|
81
|
-
|
|
82
|
-
|
|
51
|
+
- global and `static` variables are protected by the main actor,
|
|
52
|
+
- protocol conformances are isolated to the main actor,
|
|
53
|
+
- UI code that never runs in parallel needs almost no annotations.
|
|
83
54
|
|
|
84
55
|
```swift
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
56
|
+
final class DownloadSettings {
|
|
57
|
+
static let shared = DownloadSettings()
|
|
58
|
+
var wifiOnly = true
|
|
88
59
|
}
|
|
89
60
|
|
|
90
|
-
final class
|
|
91
|
-
let
|
|
92
|
-
var selection: [
|
|
61
|
+
final class LibraryModel {
|
|
62
|
+
let renderer = WaveformRenderer()
|
|
63
|
+
var selection: [Episode.ID] = []
|
|
93
64
|
}
|
|
94
65
|
|
|
95
|
-
extension
|
|
96
|
-
func
|
|
66
|
+
extension LibraryModel: Archivable {
|
|
67
|
+
func archive() -> Data { Data() }
|
|
97
68
|
}
|
|
98
69
|
```
|
|
99
70
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
default behavior.
|
|
71
|
+
None of these declarations says `@MainActor`, yet all of them are main-actor
|
|
72
|
+
isolated. Choose this mode for apps, command-line tools and other executables
|
|
73
|
+
dominated by UI or sequential logic. Keep it off for libraries that callers
|
|
74
|
+
should be able to use from any isolation.
|
|
105
75
|
|
|
106
|
-
|
|
107
|
-
the actor, eliminating data races without annotation.
|
|
76
|
+
## Async functions run on the caller (SE-0461)
|
|
108
77
|
|
|
109
|
-
|
|
78
|
+
When `NonisolatedNonsendingByDefault` is enabled, a `nonisolated` async function
|
|
79
|
+
inherits its caller's actor; the explicit spelling is `nonisolated(nonsending)`.
|
|
80
|
+
Arguments never leave the caller's isolation, so the "risks causing data races"
|
|
81
|
+
errors above disappear with no annotation. To run on the thread pool instead,
|
|
82
|
+
mark the function `@concurrent`.
|
|
110
83
|
|
|
111
|
-
## `@concurrent`
|
|
84
|
+
## Leaving the caller with `@concurrent`
|
|
112
85
|
|
|
113
|
-
|
|
114
|
-
|
|
86
|
+
A pattern that keeps the cache on the caller's actor and sends only the heavy
|
|
87
|
+
work to the pool:
|
|
115
88
|
|
|
116
89
|
```swift
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
let
|
|
123
|
-
|
|
124
|
-
|
|
90
|
+
@MainActor
|
|
91
|
+
final class ThumbnailStore {
|
|
92
|
+
private var cache: [URL: Thumbnail] = [:]
|
|
93
|
+
|
|
94
|
+
func thumbnail(for url: URL) async throws -> Thumbnail {
|
|
95
|
+
if let cached = cache[url] { return cached }
|
|
96
|
+
let made = try await Self.decode(url)
|
|
97
|
+
cache[url] = made
|
|
98
|
+
return made
|
|
125
99
|
}
|
|
126
100
|
|
|
127
101
|
@concurrent
|
|
128
|
-
static func
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
**Steps to offload a function to background:**
|
|
133
|
-
1. Ensure the containing type is `nonisolated` (or the function itself).
|
|
134
|
-
2. Add `@concurrent` to the function.
|
|
135
|
-
3. Add `async` if not already asynchronous.
|
|
136
|
-
4. Add `await` at call sites.
|
|
137
|
-
|
|
138
|
-
```swift
|
|
139
|
-
nonisolated struct PhotoProcessor {
|
|
140
|
-
@concurrent
|
|
141
|
-
func process(data: Data) async -> ProcessedPhoto? { /* ... */ }
|
|
102
|
+
nonisolated private static func decode(_ url: URL) async throws -> Thumbnail {
|
|
103
|
+
let bytes = try Data(contentsOf: url)
|
|
104
|
+
return Thumbnail(byteCount: bytes.count)
|
|
105
|
+
}
|
|
142
106
|
}
|
|
143
107
|
|
|
144
|
-
|
|
108
|
+
struct Thumbnail: Sendable { let byteCount: Int }
|
|
145
109
|
```
|
|
146
110
|
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
`Task.immediate` starts executing synchronously on the current actor before any
|
|
150
|
-
suspension point, rather than being enqueued. There is also
|
|
151
|
-
`Task.immediateDetached` which combines immediate start with detached semantics.
|
|
111
|
+
The four steps are always the same: make the type or function `nonisolated`,
|
|
112
|
+
add `@concurrent`, make it `async` if needed, and `await` it at each call site.
|
|
152
113
|
|
|
153
|
-
|
|
154
|
-
Task.immediate { await handleUserInput() }
|
|
155
|
-
```
|
|
114
|
+
## Starting without a queue hop (SE-0472)
|
|
156
115
|
|
|
157
|
-
|
|
116
|
+
`Task.immediate { }` begins executing synchronously on the current actor and
|
|
117
|
+
only suspends at its first `await`, where a plain `Task { }` would be enqueued
|
|
118
|
+
and start later. Reach for it when that enqueue delay is visible, such as
|
|
119
|
+
reacting to a keystroke. `Task.immediateDetached { }` does the same without
|
|
120
|
+
inheriting context. Both need the OS 26 runtime.
|
|
158
121
|
|
|
159
|
-
## Isolated
|
|
160
|
-
|
|
161
|
-
A conformance that needs MainActor state is called an *isolated conformance*.
|
|
162
|
-
The compiler ensures the conformance is only used in a matching isolation
|
|
163
|
-
context.
|
|
122
|
+
## Isolated conformances
|
|
164
123
|
|
|
165
124
|
```swift
|
|
166
|
-
protocol
|
|
167
|
-
func
|
|
125
|
+
protocol Archivable {
|
|
126
|
+
func archive() -> Data
|
|
168
127
|
}
|
|
169
128
|
|
|
170
|
-
|
|
171
|
-
|
|
129
|
+
@MainActor
|
|
130
|
+
final class PlaylistModel {
|
|
131
|
+
var titles: [String] = []
|
|
172
132
|
}
|
|
173
133
|
|
|
174
|
-
@MainActor
|
|
175
|
-
|
|
176
|
-
|
|
134
|
+
extension PlaylistModel: @MainActor Archivable {
|
|
135
|
+
func archive() -> Data { Data(titles.joined(separator: "\n").utf8) }
|
|
136
|
+
}
|
|
177
137
|
|
|
178
|
-
|
|
179
|
-
|
|
138
|
+
@MainActor
|
|
139
|
+
struct BackupBatch {
|
|
140
|
+
var items: [any Archivable] = []
|
|
141
|
+
mutating func include(_ playlist: PlaylistModel) {
|
|
142
|
+
items.append(playlist) // allowed: same isolation
|
|
180
143
|
}
|
|
181
144
|
}
|
|
182
145
|
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
//
|
|
189
|
-
// 'Exportable' cannot be used in nonisolated context
|
|
190
|
-
items.append(item)
|
|
146
|
+
nonisolated struct OffMainBackupBatch {
|
|
147
|
+
var items: [any Archivable] = []
|
|
148
|
+
mutating func include(_ playlist: PlaylistModel) {
|
|
149
|
+
items.append(playlist)
|
|
150
|
+
// error: main actor-isolated conformance of 'PlaylistModel' to 'Archivable'
|
|
151
|
+
// cannot be used in nonisolated context
|
|
191
152
|
}
|
|
192
153
|
}
|
|
193
154
|
```
|
|
194
155
|
|
|
195
|
-
## SE-0481
|
|
156
|
+
## Immutable weak references (SE-0481)
|
|
196
157
|
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
158
|
+
`weak let` declares a weak reference that is never reassigned. Because the
|
|
159
|
+
binding cannot change, a type storing only `weak let` references to `Sendable`
|
|
160
|
+
objects can itself be `Sendable`. Implemented in Swift 6.3.
|
|
200
161
|
|
|
201
|
-
|
|
162
|
+
```swift
|
|
163
|
+
final class SessionObserver: Sendable {
|
|
164
|
+
weak let session: PlaybackSession?
|
|
165
|
+
init(session: PlaybackSession) { self.session = session }
|
|
166
|
+
}
|
|
167
|
+
```
|
|
202
168
|
|
|
203
|
-
|
|
204
|
-
via `AsyncSequence`.
|
|
169
|
+
## Transactional observation (SE-0475)
|
|
205
170
|
|
|
206
171
|
```swift
|
|
207
|
-
for await
|
|
208
|
-
|
|
172
|
+
for await pending in Observations({ uploads.pendingCount }) {
|
|
173
|
+
badge.update(pending)
|
|
209
174
|
}
|
|
210
175
|
```
|
|
211
176
|
|
|
212
|
-
|
|
177
|
+
Each iteration sees a consistent snapshot of the properties the closure read.
|
|
178
|
+
|
|
179
|
+
## Global and static state
|
|
213
180
|
|
|
214
|
-
|
|
215
|
-
is
|
|
181
|
+
Globals and statics are shared by definition, so they race unless isolated. The
|
|
182
|
+
usual answer is the main actor:
|
|
216
183
|
|
|
217
184
|
```swift
|
|
218
185
|
@MainActor
|
|
219
|
-
final class
|
|
220
|
-
static let shared =
|
|
186
|
+
final class FeatureFlags {
|
|
187
|
+
static let shared = FeatureFlags()
|
|
188
|
+
var experiments: Set<String> = []
|
|
221
189
|
}
|
|
222
190
|
```
|
|
223
191
|
|
|
224
|
-
|
|
192
|
+
Under SE-0466 the `@MainActor` is inferred and can be deleted.
|
|
225
193
|
|
|
226
|
-
##
|
|
194
|
+
## Build settings and migration
|
|
227
195
|
|
|
228
|
-
|
|
229
|
-
-
|
|
230
|
-
-
|
|
196
|
+
- Every approachable-concurrency feature is opt-in.
|
|
197
|
+
- Xcode 26: Build Settings, section Swift Compiler - Concurrency.
|
|
198
|
+
- SwiftPM: `swiftSettings` on each target, through the `SwiftSetting` API.
|
|
231
199
|
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
200
|
+
```swift
|
|
201
|
+
.target(
|
|
202
|
+
name: "PlayerApp",
|
|
203
|
+
swiftSettings: [
|
|
204
|
+
.defaultIsolation(MainActor.self),
|
|
205
|
+
.enableUpcomingFeature("NonisolatedNonsendingByDefault"),
|
|
206
|
+
.enableUpcomingFeature("InferIsolatedConformances")
|
|
207
|
+
]
|
|
208
|
+
)
|
|
209
|
+
```
|
|
235
210
|
|
|
236
|
-
Swift 6
|
|
237
|
-
|
|
211
|
+
- Swift 6 language mode means complete checking with data-race errors.
|
|
212
|
+
Targeted and Minimal exist only for Swift 5 targets preparing to switch.
|
|
213
|
+
- Swift 6.2 ships migration tooling that can apply many of the required edits
|
|
214
|
+
automatically; see swift.org/migration.
|
|
238
215
|
|
|
239
|
-
##
|
|
216
|
+
## The progression
|
|
240
217
|
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
2.
|
|
244
|
-
3. When
|
|
218
|
+
1. Start with main-actor-by-default code: nothing runs in parallel, so nothing
|
|
219
|
+
races.
|
|
220
|
+
2. Let async functions run where they are called: still no parallelism.
|
|
221
|
+
3. When profiling shows a need, move specific functions to the pool with
|
|
222
|
+
`@concurrent`.
|
|
@@ -1,52 +1,64 @@
|
|
|
1
1
|
# Concurrency Diagnostics
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
|
8
|
-
|
|
|
9
|
-
| `
|
|
10
|
-
| `
|
|
11
|
-
| `
|
|
12
|
-
| `
|
|
13
|
-
| `
|
|
14
|
-
| `
|
|
15
|
-
| `
|
|
16
|
-
| `
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
##
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
- `
|
|
25
|
-
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
`@
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
3
|
+
## Compiler messages and their fixes
|
|
4
|
+
|
|
5
|
+
| Message | What happened | Fix, in order of preference |
|
|
6
|
+
|---|---|---|
|
|
7
|
+
| `Sending 'x' risks causing data races` | A non-`Sendable` value crosses an isolation boundary | Make the type `Sendable`; take it as a `sending` parameter; restructure so it does not cross |
|
|
8
|
+
| `Capture of 'x' with non-sendable type 'T' in a '@Sendable' closure` | A `@Sendable` closure captures a non-`Sendable` value | Make the type `Sendable`; capture a copy of the data you need; move the state into an actor |
|
|
9
|
+
| `Non-sendable type 'T' returned by implicitly asynchronous call` | A non-`Sendable` result crosses isolation on the way back | Return a `Sendable` type, or do the work in the caller's isolation |
|
|
10
|
+
| `Main actor-isolated property 'x' can not be mutated from a nonisolated context` | Main-actor state written from nonisolated code | Mark the caller `@MainActor`; restructure; as a last step, `await MainActor.run { }` inside an async caller that must stay nonisolated |
|
|
11
|
+
| `Call to main actor-isolated instance method 'f()' in a synchronous nonisolated context` | Sync nonisolated code calls main-actor code | Mark the caller `@MainActor`; make it async and `await`; in SwiftUI start the call from `.task { }` |
|
|
12
|
+
| `Actor-isolated property 'x' can not be referenced from a nonisolated context` | Code outside the actor touches its state | `await` the access, or move the code into the actor |
|
|
13
|
+
| `Type 'T' does not conform to the 'Sendable' protocol` | Some stored properties are not `Sendable` | Use an immutable value or a snapshot; then actor isolation or a lock; `@unchecked Sendable` only when an internal lock exists and is written down |
|
|
14
|
+
| `Passing closure as a 'sending' parameter risks causing data races` | The closure captures values that may race | Capture only `Sendable` values, or keep the captured state inside one isolation domain |
|
|
15
|
+
| `Task-isolated value of type 'T' passed as a strongly transferred parameter` | A value is moved out of a task that still uses it | Pass a copy, or return it as `sending` |
|
|
16
|
+
| `Var 'x' is not concurrency-safe because it is nonisolated global shared mutable state` | A mutable global has no isolation | `@MainActor`; move it into an actor; make it a `let` of a `Sendable` type; `nonisolated(unsafe)` only with a written justification |
|
|
17
|
+
|
|
18
|
+
Exact wording varies between compiler releases; match on the key phrase.
|
|
19
|
+
|
|
20
|
+
## Effects of the 6.2 approachable settings
|
|
21
|
+
|
|
22
|
+
- `NonisolatedNonsendingByDefault` (SE-0461): async functions without explicit
|
|
23
|
+
isolation run as `nonisolated(nonsending)`, on the caller's actor.
|
|
24
|
+
- `@concurrent` marks the functions that should leave the caller on purpose.
|
|
25
|
+
- `InferSendableFromCaptures` (SE-0418): closures and key paths become
|
|
26
|
+
`Sendable` when everything they capture is. It is already on in Swift 6
|
|
27
|
+
language mode; in Swift 5 mode it is one of the upcoming features the
|
|
28
|
+
Approachable Concurrency setting enables. Either way it removes explicit
|
|
29
|
+
`@Sendable` annotations.
|
|
30
|
+
|
|
31
|
+
## Adopting strict checking
|
|
32
|
+
|
|
33
|
+
- Swift 6 language mode, including 6.3, always runs complete checking and
|
|
34
|
+
reports data-race problems as errors.
|
|
35
|
+
- The staged levels exist only before the switch: a Swift 5 target can go
|
|
36
|
+
through `Minimal` or `Targeted` on the way to `Complete`, then move to the
|
|
37
|
+
Swift 6 language mode.
|
|
38
|
+
- Fix from the leaves upward: models and DTOs first, then services, then the
|
|
39
|
+
UI layer. Leaf fixes often make the upper errors vanish.
|
|
40
|
+
- A third-party module without `Sendable` annotations can be imported with
|
|
41
|
+
`@preconcurrency import` for now. Write down when and how it will be removed.
|
|
42
|
+
|
|
43
|
+
### Order of fixes for a Sendable error
|
|
44
|
+
|
|
45
|
+
1. An immutable `struct` or `enum`.
|
|
46
|
+
2. A `final class` whose stored properties are all `let`.
|
|
47
|
+
3. Isolation to an actor or a global actor.
|
|
48
|
+
4. A small wrapper that synchronizes access with a lock.
|
|
49
|
+
5. `@unchecked Sendable`, only when a lock invariant exists that the compiler
|
|
50
|
+
cannot see, and with that invariant written next to the declaration.
|
|
51
|
+
|
|
52
|
+
## Races the compiler cannot see: Thread Sanitizer
|
|
53
|
+
|
|
54
|
+
Thread Sanitizer (`-sanitize=thread`) detects data races at run time, including
|
|
55
|
+
ones inside code that static checking cannot reason about. In Xcode, open the
|
|
56
|
+
scheme editor, select the Run action, and tick Thread Sanitizer on the
|
|
57
|
+
Diagnostics tab.
|
|
58
|
+
|
|
59
|
+
It typically reports:
|
|
60
|
+
|
|
61
|
+
- a `Dictionary` or `Array` read and written from several threads with no
|
|
62
|
+
actor or lock around it;
|
|
63
|
+
- delegate methods called on a queue the code did not expect;
|
|
64
|
+
- completion handlers writing a property while synchronous code reads it.
|