Axiom Concurrency

CharlesWiltgen/Axiom/axiom-cursor/skills/axiom-concurrency

作者 CharlesWiltgen82c7feafae634a79b4336b3381289441886c122c無授權條款1.1K 個星標收錄於 2026年10月9日更新於 2026年10月9日儲存庫今天更新

Use when writing ANY async code, actors, or threads in an Apple-platform app, or seeing ANY concurrency error. Covers Swift 6 concurrency, @MainActor, Sendable, data races, async/await patterns.

AI 產生的概覽

指導 Apple 平台上的 Swift 6 並行開發,涵蓋 async/await、actor、Sendable、隔離與執行階段崩潰診斷。

功能
這是一個針對 Apple 平台 Swift 並行的路由式參考技能。它指向多份子文件,分別說明 async/await 與 actor 模式、API 語法、同步原始元件、MainActor.assumeIsolated 與 @preconcurrency、隔離繼承造成的執行階段崩潰,以及並行效能分析。它也說明如何將並行稽核委派給 concurrency-auditor 子代理,並處理與效能、建置、資料等相關技能的衝突。
適用情境
適用於在 Apple 平台應用程式中撰寫非同步程式碼、actor 或執行緒時,或遇到資料競爭、Sendable 違規、Swift 6 移轉等並行錯誤時。它也用于診斷無警告建置在執行階段因隔離斷言而崩潰的問題,以及分析 actor 爭用或執行緒集區耗盡。
執行需求
需要能夠讀取所引用子文件的代理環境。文件說明 xclog、xcsym 和 xcprof 範例必須對應到同名 MCP 工具,而且必須存在 Axiom MCP 整合;此技能不附帶指令碼。

Cursor MCP Tool Boundary

The xclog, xcsym, and xcprof examples below are reference syntax, not executable commands for Cursor. Map each subcommand to the same-named MCP tool—for example, xclog launch to axiom_xclog_launch, xcsym crash to axiom_xcsym_crash, and xcprof record to axiom_xcprof_record—and preserve its arguments as structured fields. Do not run a bare helper binary. If a required MCP tool is unavailable, stop and report that the Axiom MCP integration is missing; do not fall back to a same-named executable.

Concurrency

You MUST use this skill for ANY concurrency, async/await, threading, or Swift 6 concurrency work.

Cursor Subagent Routing

Delegate to the appropriate Cursor subagent when this router calls for a specialized auditor.

Quick Reference

Symptom / TaskReference
async/await patterns, @MainActor, actorsSee skills/swift-concurrency.md
Data race errors, Sendable conformanceSee skills/swift-concurrency.md
Swift 6 migration, @concurrent attributeSee skills/swift-concurrency.md
Actor definition, reentrancy, global actorsSee skills/swift-concurrency-ref.md
Task/TaskGroup/cancellation APISee skills/swift-concurrency-ref.md
AsyncStream, continuationsSee skills/swift-concurrency-ref.md
DispatchQueue → actor migrationSee skills/swift-concurrency-ref.md
Mutex (iOS 18+), OSAllocatedUnfairLockSee skills/synchronization.md
Atomic types, lock vs actor decisionSee skills/synchronization.md
MainActor.assumeIsolatedSee skills/assume-isolated.md
@preconcurrency protocol conformancesSee skills/assume-isolated.md
Legacy delegate callbacksSee skills/assume-isolated.md
Warning-free build crashes with _dispatch_assert_queue_failSee skills/isolation-inheritance-diag.md
Crash signature _swift_task_checkIsolatedSwiftSee skills/isolation-inheritance-diag.md
Core Data context.perform runtime crash inside @MainActor classSee skills/isolation-inheritance-diag.md
Combine .map/.sink crash from receive(on:) placementSee skills/isolation-inheritance-diag.md
Delegate method crash from isolation inheritance (CLLocationManager, NSDocument, AVAudioPlayerDelegate, WKNavigationDelegate, PHPhotoLibraryChangeObserver)See skills/isolation-inheritance-diag.md
PhotoKit performChanges block traps on PhotoKit's queueSee skills/isolation-inheritance-diag.md
Actor reentrancy / stale state across awaitSee skills/isolation-inheritance-diag.md
Swift Concurrency Instruments templateSee skills/concurrency-profiling.md
Actor contention diagnosisSee skills/concurrency-profiling.md
Thread pool exhaustionSee skills/concurrency-profiling.md

Decision Tree

dot
digraph concurrency {    start [label="Concurrency task" shape=ellipse];    what [label="What do you need?" shape=diamond];
    start -> what;    what -> "skills/swift-concurrency.md" [label="async/await, actors,\nSendable, data races,\nSwift 6 migration"];    what -> "skills/swift-concurrency-ref.md" [label="API syntax lookup\n(TaskGroup, AsyncStream,\ncontinuations, migration)"];    what -> "skills/synchronization.md" [label="Mutex, locks,\natomic types"];    what -> "skills/assume-isolated.md" [label="assumeIsolated,\n@preconcurrency"];    what -> "skills/isolation-inheritance-diag.md" [label="warning-free build crashes\n_dispatch_assert_queue_fail\n_swift_task_checkIsolatedSwift"];    what -> "skills/concurrency-profiling.md" [label="profile async perf,\nactor contention"];}
  1. Data races / actor isolation / @MainActor / Sendable / Swift 6 migration? → skills/swift-concurrency.md 1a. Need specific API syntax (actor definition, TaskGroup, AsyncStream, continuations)? → skills/swift-concurrency-ref.md 1b. NotificationCenter observer, userInfo casting, or Sendable errors unpacking a notification? → skills/swift-concurrency-ref.md (Typed Notifications — MainActorMessage/AsyncMessage, iOS 26+)
  2. Writing async/await code? → skills/swift-concurrency.md
  3. assumeIsolated / @preconcurrency? → skills/assume-isolated.md 3a. Warning-free Swift 6 build that crashes in production with _dispatch_assert_queue_fail or _swift_task_checkIsolatedSwift? → skills/isolation-inheritance-diag.md
  4. Mutex / lock / synchronization? → skills/synchronization.md
  5. Profile async performance / actor contention? → skills/concurrency-profiling.md
  6. Value type / ARC / generic optimization? → See axiom-performance (skills/swift-performance.md)
  7. borrowing / consuming / ~Copyable? → See axiom-swift (skills/ownership-conventions.md)
  8. Combine / @Published / AnyCancellable / reactive streams? → See axiom-uikit (skills/combine-patterns.md)
  9. Want automated concurrency scan? → concurrency-auditor (Agent)
Concurrency in practice
  • HealthKit queries with Swift Concurrency (canonical bridging example) → See axiom-health (skills/queries.md)

Conflict Resolution

concurrency vs axiom-performance: When app freezes or feels slow:

  1. Try concurrency FIRST — Main thread blocking is the #1 cause of UI freezes. Check for synchronous work on @MainActor before profiling.
  2. Only use axiom-performance if concurrency fixes don't help — Profile after ruling out obvious blocking.
  3. To pin a specific freeze to app code, see the Hang Window Workflow in axiom-performance (skills/hang-diagnostics.md) — re-scope xcprof analyze to the hang window with --start-ms/--end-ms --user-binary to surface the app-owned frame on the main thread.

concurrency vs axiom-build: When seeing Swift 6 concurrency errors:

  • Use concurrency, NOT axiom-build — Concurrency errors are CODE issues, not environment issues.

concurrency vs axiom-data: When concurrency errors involve Core Data or SwiftData:

  • Core Data threading (NSManagedObjectContext thread confinement) → use axiom-data first
  • SwiftData + @MainActor ModelContext → use concurrency
  • General "background saves losing data" → use axiom-data first
  • GRDB Sendable patterns (struct records, databaseSelection as computed property, Swift 6 conformance) → See axiom-data (skills/grdb-performance.md) §8

Critical Patterns

Swift Concurrency (skills/swift-concurrency.md):

  • Progressive journey: single-threaded → async → concurrent → actors
  • @concurrent attribute for forced background execution
  • Isolated conformances, main actor mode
  • 12 copy-paste patterns including delegate value capture, weak self in Tasks
  • Comprehensive decision tree for 7 common error messages

API Reference (skills/swift-concurrency-ref.md):

  • Actor definition, reentrancy, global actors, nonisolated
  • Sendable patterns, @unchecked Sendable, sending parameter
  • Task/TaskGroup/cancellation, async let, withDiscardingTaskGroup
  • AsyncStream, continuations, buffering policies
  • Isolation patterns (#isolation, @preconcurrency, nonisolated(unsafe))
  • DispatchQueue/DispatchGroup/completion handler migration

Synchronization (skills/synchronization.md):

  • Mutex (iOS 18+), OSAllocatedUnfairLock (iOS 16+), Atomic types
  • Lock vs actor decision tree
  • Danger patterns: locks across await, semaphores in async context

Profiling (skills/concurrency-profiling.md):

  • Swift Concurrency Instruments template
  • Diagnosing main thread blocking, actor contention, thread pool exhaustion
  • Safe vs unsafe primitives for cooperative pool

Runtime Isolation Crashes (skills/isolation-inheritance-diag.md):

  • _dispatch_assert_queue_fail and _swift_task_checkIsolatedSwift signatures
  • Closure isolation inheritance (Core Data perform, Combine .map, NotificationCenter .sink)
  • Delegate method isolation inheritance (CLLocationManager, NSDocument, AVAudioPlayerDelegate, WKNavigationDelegate)
  • MainActor.assumeIsolated misuse
  • Actor reentrancy state staleness

Automated Scanning

Concurrency audit → Delegate to the concurrency-auditor subagent or /axiom-audit concurrency (5-phase semantic audit: maps isolation architecture, detects 8 anti-patterns, reasons about missing concurrency patterns, correlates compound risks, scores Swift 6.4 readiness)

Anti-Rationalization

ThoughtReality
"Just add @MainActor and it'll work"@MainActor has isolation inheritance rules. skills/swift-concurrency.md covers all patterns.
"I'll use nonisolated(unsafe) to silence the warning"Silencing warnings hides data races. skills/swift-concurrency.md shows the safe pattern.
"It's just one async call"Even single async calls have cancellation and isolation implications.
"I know how actors work"Actor reentrancy and isolation rules changed in Swift 6.2.
"I'll fix the Sendable warnings later"Sendable violations cause runtime crashes. Fix them now.
"My Swift 6 build has zero warnings, so isolation is correct"Static checking can't see SDK callbacks. Runtime checks crash anyway. skills/isolation-inheritance-diag.md.
"I'll wrap the crash in MainActor.assumeIsolated"assumeIsolated is a runtime trap, not a silencer. Wrong assumption = crash.
"Combine is dead, just use async/await"Combine has no deprecation notice. Rewriting working pipelines wastes time. See See axiom-uikit (skills/combine-patterns.md).
"I'll use @unchecked Sendable to silence this"You're hiding a data race from the compiler. It will crash in production.
"This async function runs on a background thread"Check its isolation, don't assume. A @MainActor async function runs entirely on the main actor, and nonisolated async runs on the caller's actor under NonisolatedNonsendingByDefault (Swift 6.2+; new Xcode projects set SWIFT_APPROACHABLE_CONCURRENCY = YES, the setting's own default is NO, and SwiftPM does not enable it) — those are the main-thread freezes. Without that setting nonisolated async hops to the global executor. @concurrent forces off-actor work either way.

Example Invocations

User: "I'm getting 'data race' errors in Swift 6" → Read: skills/swift-concurrency.md

User: "How do I use @MainActor correctly?" → Read: skills/swift-concurrency.md

User: "How do I create a TaskGroup?" → Read: skills/swift-concurrency-ref.md

User: "What's the AsyncStream API?" → Read: skills/swift-concurrency-ref.md

User: "How do I use assumeIsolated?" → Read: skills/assume-isolated.md

User: "Should I use Mutex or actor?" → Read: skills/synchronization.md

User: "My async code is slow, how do I profile it?" → Read: skills/concurrency-profiling.md

User: "My warning-free Swift 6 build crashes in production with _dispatch_assert_queue_fail" → Read: skills/isolation-inheritance-diag.md

User: "Core Data context.perform crashes inside an @MainActor view model" → Read: skills/isolation-inheritance-diag.md

User: "CLLocationManager delegate method is crashing with _swift_task_checkIsolatedSwift" → Read: skills/isolation-inheritance-diag.md

User: "My app is slow due to unnecessary copying" → See axiom-performance (skills/swift-performance.md)

User: "Check my code for Swift 6 concurrency issues" → Invoke: concurrency-auditor agent

來源與署名

來源:CharlesWiltgen/Axiom位於axiom-cursor/skills/axiom-concurrency提交82c7fea

授權條款: 無授權條款

內容歸原作者所有。SourceWeft 從公開儲存庫中收錄這些內容。

檢舉或申請下架