axiom-accessibility
Use when fixing or auditing ANY accessibility issue — VoiceOver, Dynamic Type, color contrast, touch targets, WCAG compliance, App Store accessibility review.
Use when the user mentions concurrency checking, Swift 6 compliance, data race prevention, or async code review.
$ npx -y skills add charleswiltgen/axiom --skill axiom-audit-concurrency --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/axiom-audit-concurrencyContext preview
The summary Claude sees to decide when to auto-load this skill.
Use when the user mentions concurrency checking, Swift 6 compliance, data race prevention, or async code review.
name: axiom-audit-concurrency description: Use when the user mentions concurrency checking, Swift 6 compliance, data race prevention, or async code review. license: MIT
You are an expert at detecting Swift 6 concurrency issues — both known anti-patterns AND missing/incomplete patterns that cause data races, UI freezes, and resource leaks.
Run every Glob, Grep, and Read this prompt lists. Do not reason from training data instead of scanning.
Skip: `*Tests.swift`, `*Previews.swift`, `*/Pods/*`, `*/Carthage/*`, `*/.build/*`, `*/DerivedData/*`, `*/scratch/*`, `*/docs/*`, `*/.claude/*`, `*/.claude-plugin/*`
Glob: **/*.swift (excluding test/vendor paths) Grep for: - `actor ` declarations — which types are actors - `@MainActor` — which types/functions are MainActor-isolated - `@concurrent` — which functions opt into background execution - `nonisolated` — which functions explicitly opt out of isolation
Grep for:
- `.task {`, `.task(id:` — SwiftUI task modifiers
- `Task {`, `Task.detached` — unstructured task creation
- `async let` — structured child tasks
- `TaskGroup`, `withTaskGroup`, `withThrowingTaskGroup` — structured parallel work
- `AsyncStream`, `AsyncThrowingStream`, `for await` — async sequencesRead 2-3 key files (App entry point, main view model, a networking layer file) to understand:
Write a brief **Isolation Architecture Map** (5-10 lines) summarizing:
Present this map in the output before proceeding.
Run all 8 existing detection patterns. For every grep match, use Read to verify the surrounding context before reporting — grep patterns have high recall but need contextual verification.
Patterns 4, 5, and 8 ask questions the Swift compiler answers exactly. If your launch prompt contains a `COMPILER DIAGNOSTICS` block, **use it as the source for those three patterns and do not grep for them** — report the compiler's own `file:line` and message, at HIGH confidence.
Two limits on the block, both of which you must respect:
If there is no `COMPILER DIAGNOSTICS` block, fall back to the grep patterns for 4, 5, and 8 and label those findings **LOW confidence (no compiler verification)**.
Patterns 1, 2, 3, 6, and 7 are unaffected — the compiler has nothing to say about them.
**Pattern**: UIViewController, UIView, ObservableObject without @MainActor **Search**: `class.*UIViewController`, `class.*ObservableObject` — check 5 lines before for @MainActor **Issue**: Crashes when UI modified from background threads **Fix**: Add `@MainActor` to class declaration **Note**: SwiftUI Views are implicitly @MainActor — not an issue **Field signal**: Crashes with xcsym `pattern_tag=swift_concurrency_violation` (fires on `_swift_task_isCurrentExecutor` in the exception subtype) almost always trace back to this anti-pattern. If the user has `.ips` artifacts, run `xcsym crash --format=summary <file>` and correlate the crashed frames with grep hits.
**Pattern**: `Task { self.property }` without `[weak self]` in a class **Search**: `Task\s*\{` then check for `self.` without `[weak self]` **Issue**: Strong capture extends object lifetime for the Task's duration. For fire-and-forget Tasks this is temporary; for stored Tasks it's a retain cycle (see Pattern 6). **Fix**: Use `Task { [weak self] in ... }` **Note**: Only applies to class types — struct self capture is fine. For stored Tasks (`var task: Task<...>?`), Pattern 6 covers the retain cycle case specifically.
**Pattern**: `nonisolated func` with `Task { self.property }` inside **Search**: `nonisolated func` — Read context, check for Task containing `self.` **Issue**: "Sending 'self' risks causing data races" in Swift 6 **Fix**: Capture values before Task, use captured values inside
**Pattern**: Non-Sendable types across actor boundaries **Source**: `COMPILER DIAGNOSTICS` — `issueType: SendingClosureRisksDataRace`, or messages containing "risks causing data races" / "non-Sendable" **Fallback search**: `@Sendable`, `: Sendable` patterns — LOW confidence. This searches for *correctly annotated* code, so it locates places to read rather than violations; report nothing from it without reading the surrounding code. **Issue**: Data races **Fix**: Make the type Sendable, or transfer ownership with `sending`
**Pattern**: Actor property accessed without await **Source**: `
Battle-tested skills, agents, and tools for modern Apple OS development — Swift 6, SwiftUI, Liquid Glass, Apple Intelligence, and more. Supports Claude Code, Codex, and all other popular coding harnesses and AI-savvy IDEs.
Repo: charleswiltgen/axiom
Use when fixing or auditing ANY accessibility issue — VoiceOver, Dynamic Type, color contrast, touch targets, WCAG compliance, App Store accessibility review.
Use when implementing, testing, or evaluating ANY Apple Intelligence, on-device AI, or speech-to-text feature. Covers Foundation Models, @Generable,…
Use when the user has a crash log (.ips, MetricKit JSON, legacy .crash text, .xccrashpoint bundle, or pasted text) that needs analysis.
Use when the user mentions Swift performance audit, code optimization, or performance review — ARC issues, allocation patterns, and generic specialization.
Use when the user mentions SwiftUI performance, janky scrolling, slow animations, or view update issues — expensive bodies, formatters, whole-collection…
Use when the user mentions flaky tests, tests that pass locally but fail in CI, race conditions in tests, or needs to diagnose WHY a specific test fails.