Swift Concurrency
Treat isolation and cancellation as API contracts. Compile under the project's real Swift language and strict-concurrency settings.
Core rules
- Prefer structured child tasks and task groups. Detached tasks require an explicit ownership and context-transfer justification.
- Keep mutable shared state actor-isolated or otherwise synchronized; do not silence diagnostics with unchecked
Sendablewithout proof. - Propagate cancellation through loops, AsyncSequence production, continuations, and I/O adapters.
- Resume checked continuations exactly once on every path; retain cancellation handles for callback APIs.
- Do not block cooperative executors with synchronous I/O or locks held across suspension.
- Preserve actor isolation in public protocols and closures. Use
@MainActoronly for UI/main-thread state, not as a general race workaround. - Define ordering, buffering, backpressure, termination, and cleanup for AsyncStream/AsyncSequence adapters.
- Treat task-local values and priorities as contextual hints, not durable business state.
Review sequence
- Map task creation to owners and termination conditions.
- Trace actor isolation and
Sendablecrossings. - Trace cancellation from caller to resources and continuations.
- Identify blocking work, unbounded buffers, reentrancy assumptions, and priority inversions.
- Add deterministic lifecycle tests using clocks, continuations, or event-driven coordination.
- Run strict-concurrency compilation and stress the affected state transitions.
swift build
swift test