Add scan flow MVP and local Axiom skill workspace
This snapshot establishes the camera-to-result recognition flow and related tests while checking in the project skill/docs assets required for the configured local tooling.
This commit is contained in:
7
.claude/skills/axiom-ios-concurrency/.openskills.json
Normal file
7
.claude/skills/axiom-ios-concurrency/.openskills.json
Normal file
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"source": "CharlesWiltgen/Axiom",
|
||||
"sourceType": "git",
|
||||
"repoUrl": "https://github.com/CharlesWiltgen/Axiom",
|
||||
"subpath": ".claude-plugin/plugins/axiom/skills/axiom-ios-concurrency",
|
||||
"installedAt": "2026-04-12T08:05:35.619Z"
|
||||
}
|
||||
209
.claude/skills/axiom-ios-concurrency/SKILL.md
Normal file
209
.claude/skills/axiom-ios-concurrency/SKILL.md
Normal file
@@ -0,0 +1,209 @@
|
||||
---
|
||||
name: axiom-ios-concurrency
|
||||
description: Use when writing ANY code with async, actors, threads, or seeing ANY concurrency error. Covers Swift 6 concurrency, @MainActor, Sendable, data races, async/await patterns, performance optimization.
|
||||
license: MIT
|
||||
---
|
||||
|
||||
# iOS Concurrency Router
|
||||
|
||||
**You MUST use this skill for ANY concurrency, async/await, threading, or Swift 6 concurrency work.**
|
||||
|
||||
## When to Use
|
||||
|
||||
Use this router when:
|
||||
- Writing async/await code
|
||||
- Seeing concurrency errors (data races, actor isolation)
|
||||
- Working with @MainActor
|
||||
- Dealing with Sendable conformance
|
||||
- Optimizing Swift performance
|
||||
- Migrating to Swift 6 concurrency
|
||||
- **App freezes during loading** (likely main thread blocking)
|
||||
|
||||
## Conflict Resolution
|
||||
|
||||
**ios-concurrency vs ios-performance**: When app freezes or feels slow:
|
||||
1. **Try ios-concurrency FIRST** — Main thread blocking is the #1 cause of UI freezes. Check for synchronous work on @MainActor before profiling.
|
||||
2. **Only use ios-performance** if concurrency fixes don't help — Profile after ruling out obvious blocking.
|
||||
|
||||
**ios-concurrency vs ios-build**: When seeing Swift 6 concurrency errors:
|
||||
- **Use ios-concurrency, NOT ios-build** — Concurrency errors are CODE issues, not environment issues
|
||||
- ios-build is for "No such module", simulator issues, build failures unrelated to Swift language errors
|
||||
|
||||
**ios-concurrency vs ios-data**: When concurrency errors involve Core Data or SwiftData:
|
||||
- Core Data threading (NSManagedObjectContext thread confinement, performBackgroundTask) → **use ios-data first** — Core Data has its own threading model distinct from Swift concurrency
|
||||
- SwiftData + @MainActor ModelContext → **use ios-concurrency** — This is Swift concurrency isolation
|
||||
- General "background saves losing data" → **use ios-data first** — Framework-specific threading rules take priority
|
||||
|
||||
**Rationale**: A 2-second freeze during data loading is almost always `await` on main thread or missing background dispatch. Domain knowledge solves this faster than Time Profiler. Core Data threading violations need Core Data-specific fixes, not generic concurrency patterns.
|
||||
|
||||
## Routing Logic
|
||||
|
||||
### Swift Concurrency Issues
|
||||
|
||||
**Swift 6 concurrency patterns** → `/skill axiom-swift-concurrency`
|
||||
- async/await patterns
|
||||
- @MainActor usage
|
||||
- Actor isolation
|
||||
- Sendable conformance
|
||||
- Data race prevention
|
||||
- Swift 6 migration
|
||||
|
||||
**Swift concurrency API reference** → `/skill axiom-swift-concurrency-ref`
|
||||
- Actor definition, reentrancy, global actors
|
||||
- Sendable patterns, @unchecked Sendable
|
||||
- Task/TaskGroup/cancellation API
|
||||
- AsyncStream, continuations
|
||||
- DispatchQueue → actor migration
|
||||
|
||||
**Swift performance** → `/skill axiom-swift-performance`
|
||||
- Value vs reference types
|
||||
- Copy-on-write optimization
|
||||
- ARC overhead
|
||||
- Generic specialization
|
||||
- Collection performance
|
||||
|
||||
**Synchronous actor access** → `/skill axiom-assume-isolated`
|
||||
- MainActor.assumeIsolated
|
||||
- @preconcurrency protocol conformances
|
||||
- Legacy delegate callbacks
|
||||
- Testing MainActor code synchronously
|
||||
|
||||
**Thread-safe primitives** → `/skill axiom-synchronization`
|
||||
- Mutex (iOS 18+)
|
||||
- OSAllocatedUnfairLock (iOS 16+)
|
||||
- Atomic types
|
||||
- Lock vs actor decision
|
||||
|
||||
**Parameter ownership** → `/skill axiom-ownership-conventions`
|
||||
- borrowing/consuming modifiers
|
||||
- Noncopyable types (~Copyable)
|
||||
- ARC traffic reduction
|
||||
- consume operator
|
||||
|
||||
**Concurrency profiling** → `/skill axiom-concurrency-profiling`
|
||||
- Swift Concurrency Instruments template
|
||||
- Actor contention diagnosis
|
||||
- Thread pool exhaustion
|
||||
- Task visualization
|
||||
|
||||
**Combine reactive patterns** → `/skill axiom-combine-patterns`
|
||||
- Publisher/Subscriber lifecycle, AnyCancellable
|
||||
- Combine vs async/await decision
|
||||
- @Published + ObservableObject
|
||||
- Operator patterns, bridging
|
||||
|
||||
### Automated Scanning
|
||||
|
||||
**Concurrency audit** → Launch `concurrency-auditor` agent 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.3 readiness)
|
||||
|
||||
## Decision Tree
|
||||
|
||||
1. Data races / actor isolation / @MainActor / Sendable? → swift-concurrency
|
||||
1a. Need specific API syntax (actor definition, TaskGroup, AsyncStream, continuation)? → swift-concurrency-ref
|
||||
2. Writing async/await code? → swift-concurrency
|
||||
3. Swift 6 migration? → swift-concurrency
|
||||
4. assumeIsolated / @preconcurrency? → assume-isolated
|
||||
5. Mutex / lock / synchronization? → synchronization
|
||||
6. borrowing / consuming / ~Copyable? → ownership-conventions
|
||||
7. Profile async performance / actor contention? → concurrency-profiling
|
||||
8. Value type / ARC / generic optimization? → swift-performance
|
||||
9. Want automated concurrency scan? → concurrency-auditor (Agent)
|
||||
10. Combine / @Published / AnyCancellable / reactive streams? → combine-patterns
|
||||
|
||||
## Anti-Rationalization
|
||||
|
||||
| Thought | Reality |
|
||||
|---------|---------|
|
||||
| "Just add @MainActor and it'll work" | @MainActor has isolation inheritance rules. swift-concurrency covers all patterns. |
|
||||
| "I'll use nonisolated(unsafe) to silence the warning" | Silencing warnings hides data races. swift-concurrency shows the safe pattern. |
|
||||
| "It's just one async call" | Even single async calls have cancellation and isolation implications. swift-concurrency covers them. |
|
||||
| "I know how actors work" | Actor reentrancy and isolation rules changed in Swift 6.2. swift-concurrency is current. |
|
||||
| "I'll fix the Sendable warnings later" | Sendable violations cause runtime crashes. swift-concurrency fixes them correctly now. |
|
||||
| "Combine is dead, just use async/await" | Combine has no deprecation notice. Rewriting working pipelines wastes time and introduces bugs. combine-patterns covers incremental migration. |
|
||||
|
||||
## Critical Patterns
|
||||
|
||||
**Swift 6 Concurrency** (swift-concurrency):
|
||||
- Progressive journey: single-threaded → async → concurrent → actors
|
||||
- @concurrent attribute for forced background execution
|
||||
- Isolated conformances
|
||||
- Main actor mode for approachable concurrency
|
||||
- 11 copy-paste patterns
|
||||
|
||||
**Swift Performance** (swift-performance):
|
||||
- ~Copyable for non-copyable types
|
||||
- Copy-on-write (COW) patterns
|
||||
- Value vs reference type decisions
|
||||
- ARC overhead reduction
|
||||
- Generic specialization
|
||||
|
||||
## Example Invocations
|
||||
|
||||
User: "I'm getting 'data race' errors in Swift 6"
|
||||
→ Invoke: `/skill axiom-swift-concurrency`
|
||||
|
||||
User: "How do I use @MainActor correctly?"
|
||||
→ Invoke: `/skill axiom-swift-concurrency`
|
||||
|
||||
User: "My app is slow due to unnecessary copying"
|
||||
→ Invoke: `/skill axiom-swift-performance`
|
||||
|
||||
User: "Should I use async/await for this network call?"
|
||||
→ Invoke: `/skill axiom-swift-concurrency`
|
||||
|
||||
User: "How do I use assumeIsolated?"
|
||||
→ Invoke: `/skill axiom-assume-isolated`
|
||||
|
||||
User: "My delegate callback runs on main thread, how do I access MainActor state?"
|
||||
→ Invoke: `/skill axiom-assume-isolated`
|
||||
|
||||
User: "Should I use Mutex or actor?"
|
||||
→ Invoke: `/skill axiom-synchronization`
|
||||
|
||||
User: "What's the difference between os_unfair_lock and OSAllocatedUnfairLock?"
|
||||
→ Invoke: `/skill axiom-synchronization`
|
||||
|
||||
User: "What does borrowing do in Swift?"
|
||||
→ Invoke: `/skill axiom-ownership-conventions`
|
||||
|
||||
User: "How do I use ~Copyable types?"
|
||||
→ Invoke: `/skill axiom-ownership-conventions`
|
||||
|
||||
User: "My async code is slow, how do I profile it?"
|
||||
→ Invoke: `/skill axiom-concurrency-profiling`
|
||||
|
||||
User: "I think I have actor contention, how do I diagnose it?"
|
||||
→ Invoke: `/skill axiom-concurrency-profiling`
|
||||
|
||||
User: "My Core Data saves lose data from background tasks"
|
||||
→ Route to: `ios-data` router (Core Data threading is framework-specific)
|
||||
|
||||
User: "How do I create a TaskGroup?"
|
||||
→ Invoke: `/skill axiom-swift-concurrency-ref`
|
||||
|
||||
User: "What's the AsyncStream API?"
|
||||
→ Invoke: `/skill axiom-swift-concurrency-ref`
|
||||
|
||||
User: "How do I create a custom global actor?"
|
||||
→ Invoke: `/skill axiom-swift-concurrency-ref`
|
||||
|
||||
User: "How do I convert a completion handler to async?"
|
||||
→ Invoke: `/skill axiom-swift-concurrency-ref`
|
||||
|
||||
User: "What are the actor reentrancy rules?"
|
||||
→ Invoke: `/skill axiom-swift-concurrency-ref`
|
||||
|
||||
User: "My Combine pipeline silently stopped producing values"
|
||||
→ Invoke: `/skill axiom-combine-patterns`
|
||||
|
||||
User: "Should I use Combine or async/await for this data flow?"
|
||||
→ Invoke: `/skill axiom-combine-patterns`
|
||||
|
||||
User: "How do I bridge a Combine publisher into async/await code?"
|
||||
→ Invoke: `/skill axiom-combine-patterns`
|
||||
|
||||
User: "AnyCancellable is leaking memory"
|
||||
→ Invoke: `/skill axiom-combine-patterns`
|
||||
|
||||
User: "Check my code for Swift 6 concurrency issues"
|
||||
→ Invoke: `concurrency-auditor` agent
|
||||
Reference in New Issue
Block a user