Skip to main content
skill CX Codex

swift-concurrency-pro — Claude Code skill: Swift concurrency review

Reviews Swift code for concurrency correctness, modern API usage and common async/await pitfalls. Useful when reading or reviewing async code.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add twostraws/Swift-Concurrency-Agent-Skill --skill swift-concurrency-pro -a claude-code
Open on GitHub

What swift-concurrency-pro does

The skill inspects Swift concurrency code and reports only genuine problems — no nitpicking, no invented issues. It targets Swift 6.2 with strict concurrency checking. When code spans several targets or packages, it tells you to compare their concurrency build settings before assuming the behavior should match.

Under the hood sits a set of reference files in references/: hotspots.md with dangerous patterns to grep for, actors.md on reentrancy and isolation, structured.md and unstructured.md on task groups versus Task {}, cancellation.md, async-streams.md on AsyncStream and continuations, bridging.md, interop.md on migrating from GCD, plus bug-patterns.md, diagnostics.md and testing.md. A partial review loads only the relevant files. Findings are grouped by file: line, the rule broken, a short before/after fix, then a prioritized summary of what to change first.

Some rules are firm. The skill will not suggest @unchecked Sendable to silence a compiler error, because that hides the diagnostic while the race stays. It points to actors, value types or sending parameters instead. Third-party concurrency frameworks are not pulled in without asking. GCD is not flagged as a mistake in low-level code, framework interop or synchronous work where queues and locks are the right tool.

What it helps with

  • catch a data race in an actor before it reaches production
  • replace Task {} inside a loop with withThrowingTaskGroup
  • verify that cancellation reaches every child task
  • map strict-concurrency diagnostics to concrete fixes
  • move code off GCD and completion handlers onto async/await

Example prompts for the agent

  • Review DataLoader.swift for concurrency issues and list them by file
  • Scan Sources/Networking for dangerous patterns and suggest fixes
  • I have strict-concurrency errors in Cache.swift — walk through them and propose fixes

How to install swift-concurrency-pro

1Skills CLI (Vercel)

npx skills add twostraws/Swift-Concurrency-Agent-Skill --skill swift-concurrency-pro -a claude-code

2Manually: put the files in place

~/.claude/skills/swift-concurrency-pro/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/swift-concurrency-pro/

Step by step, with commands for each platform: How to install skills in Claude Code: five ways

Questions about swift-concurrency-pro

How do I install swift-concurrency-pro in Claude Code?

Run npx skills add twostraws/Swift-Concurrency-Agent-Skill --skill swift-concurrency-pro -a claude-code. The skill lands in ~/.claude/skills/swift-concurrency-pro/SKILL.md.

What does swift-concurrency-pro do?

It reviews Swift code for concurrency correctness, modern API usage and async/await pitfalls. Output is organized by file, with before/after fixes and a prioritized summary.

Why does the skill avoid @unchecked Sendable?

That annotation silences the compiler diagnostic without fixing the underlying race. The skill prefers actors, value types or sending parameters.

Source text

SKILL.md · MIT
---
name: swift-concurrency-pro
description: Reviews Swift code for concurrency correctness, modern API usage, and common async/await pitfalls. Use when reading, writing, or reviewing Swift concurrency code.
license: MIT
metadata:
  author: Paul Hudson
  version: "1.0"
---

Review Swift concurrency code for correctness, modern API usage, and adherence to project conventions. Report only genuine problems - do not nitpick or invent issues.

Review process:

1. Scan for known-dangerous patterns using `references/hotspots.md` to prioritize what to inspect.
1. Check for recent Swift 6.2 concurrency behavior using `references/new-features.md`.
1. Validate actor usage for reentrancy and isolation correctness using `references/actors.md`.
1. Ensure structured concurrency is preferred over unstructured where appropriate using `references/structured.md`.
1. Check unstructured task usage for correctness using `references/unstructured.md`.
1. Verify cancellation is handled correctly using `references/cancellation.md`.
1. Validate async stream and continuation usage using `references/async-streams.md`.
1. Check bridging code between sync and async worlds using `references/bridging.md`.
1. Review any legacy concurrency migrations using `references/interop.md`.
1. Cross-check against common failure modes using `references/bug-patterns.md`.
1. If the project has strict-concurrency errors, map diagnostics to fixes using `references/diagnostics.md`.
1. If reviewing tests, check async test patterns using `references/testing.md`.

If doing a partial review, load only the relevant reference files.


## Core Instructions

- Target Swift 6.2 or later with strict concurrency checking.
- If code spans multiple targets or packages, compare their concurrency build settings before assuming behavior should match.
- Prefer structured concurrency (task groups) over unstructured (`Task {}`).
- Prefer Swift concurrency over Grand Central Dispatch for new code. GCD is still acceptable in low-level code, framework interop, or performance-critical synchronous work where queues and locks are the right tool – don't flag these as errors.
- If an API offers both `async`/`await` and closure-based variants, always prefer `async`/`await`.
- Do not introduce third-party concurrency frameworks without asking first.
- Do not suggest `@unchecked Sendable` to fix compiler errors. It silences the diagnostic without fixing the underlying race. Prefer actors, value types, or `sending` parameters instead. The only legitimate use is for types with internal locking that are provably thread-safe.


## Output Format

Organize findings by file. For each issue:

1. State the file and relevant line(s).
2. Name the rule being violated.
3. Show a brief before/after code fix.

Skip files with no issues. End with a prioritized summary of the most impactful changes to make first.

Example output:

### DataLoader.swift

**Line 18: Actor reentrancy – state may have changed across the `await`.**

```swift
// Before
actor Cache {
    var items: [String: Data] = [:]

    func fetch(_ key: String) async throws -> Data {
        if items[key] == nil {
            items[key] = try await download(key)
        }
        return items[key]!
    }
}

// After
actor Cache {
    var items: [String: Data] = [:]

    func fetch(_ key: String) async throws -> Data {
        if let existing = items[key] { return existing }
        let data = try await download(key)
        items[key] = data
        return data
    }
}
```

**Line 34: Use `withTaskGroup` instead of creating tasks in a loop.**

```swift
// Before
for url in urls {
    Task { try await fetch(url) }
}

// After
try await withThrowingTaskGroup(of: Data.self) { group in
    for url in urls {
        group.addTask { try await fetch(url) }
    }

    for try await result in group {
        process(result)
    }
}
```

### Summary

1. **Correctness (high):** Actor reentrancy bug on line 18 may cause duplicate downloads and a force-unwrap crash.
2. **Structure (medium):** Unstructured tasks in loop on line 34 lose cancellation propagation.

End of example.


## References

- `references/hotspots.md` - Grep targets for code review: known-dangerous patterns and what to check for each.
- `references/new-features.md` - Swift 6.2 changes that alter review advice: default actor isolation, isolated conformances, caller-actor async behavior, `@concurrent`, `Task.immediate`, task naming, and priority escalation.
- `references/actors.md` - Actor reentrancy, shared-state annotations, global actor inference, and isolation patterns.
- `references/structured.md` - Task groups over loops, discarding task groups, concurrency limits.
- `references/unstructured.md` - Task vs Task.detached, when Task {} is a code smell.
- `references/cancellation.md` - Cancellation propagation, cooperative checking, broken cancellation patterns.
- `references/async-streams.md` - AsyncStream factory, continuation lifecycle, back-pressure.
- `references/bridging.md` - Checked continuations, wrapping legacy APIs, `@unchecked Sendable`.
- `references/interop.md` - Migrating from GCD, `Mutex`/locks, completion handlers, delegates, and Combine.
- `references/bug-patterns.md` - Common concurrency failure modes and their fixes.
- `references/diagnostics.md` - Strict-concurrency compiler errors, protocol conformance fixes, and likely remedies.
- `references/testing.md` - Async test strategy with Swift Testing, race detection, avoiding timing-based tests.

© Paul Hudson · MIT · twostraws/Swift-Concurrency-Agent-Skill

Similar skills

All skills for Code review and refactoring →

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor