npx skills add ...
npx skills add pproenca/dot-skills --skill ios-chaos-monkey
Crash-hunter skill for iOS 26 / Swift 6.2 clinic-architecture codebases that finds and fixes concurrency, memory, and I/O bugs using TDD. Covers data races, actor isolation, retain cycles, SwiftData context misuse, and sync-related failures in Domain/Data/App boundaries. Use when debugging crashes or hard-to-reproduce failures in ios-* and swift-* clinic modules.
npx skills add pproenca/dot-skills --skill ios-chaos-monkey
Adversarial crash-hunting guide for iOS and Swift applications. Contains 47 rules across 8 categories, prioritized by crash severity. Every rule follows TDD: dangerous code first, a failing test that proves the bug, then the fix that makes the test pass.
All guidance in this skill assumes the clinic modular MVVM-C architecture:
Domain + DesignSystem only (never Data, never sibling features)DependencyContainer, concrete coordinators, and Route Shell wiringDomain stays pure Swift and defines models plus repository, *Coordinating, ErrorRouting, and AppError contractsData owns SwiftData/network/sync/retry/background I/O and implements Domain protocolsReference these guidelines when:
| Priority | Category | Impact | Prefix |
|---|---|---|---|
| 1 | Data Races & Thread Safety | CRITICAL | race- |
| 2 | Memory Corruption & Leaks | CRITICAL | mem- |
| 3 | Deadlocks & Thread Starvation | HIGH | dead- |
| 4 | Async/Await & Structured Concurrency | HIGH | async- |
| 5 | File I/O & Persistence Corruption | MEDIUM-HIGH | io- |
| 6 | Collection & State Mutation | MEDIUM | mut- |
| 7 | Resource Exhaustion | MEDIUM | exhaust- |
| 8 | Objective-C Interop Traps | LOW-MEDIUM | objc- |
race-dictionary-concurrent-write - Concurrent Dictionary mutation crashes with EXC_BAD_ACCESSrace-array-concurrent-append - Concurrent Array append corrupts internal bufferrace-property-access - Unsynchronized property read-write across threadsrace-lazy-initialization - Lazy property double-initialization under concurrencyrace-singleton-initialization - Non-atomic singleton exposes partially constructed staterace-bool-flag - Non-atomic Bool flag creates check-then-act racerace-closure-capture-mutation - Closure captures mutable reference across threadsrace-delegate-nilification - Delegate set to nil during active callbackmem-closure-retain-cycle - Strong self capture in escaping closures creates retain cyclemem-timer-retain-cycle - Timer retains target creating undiscoverable retain cyclemem-delegate-strong-reference - Strong delegate reference prevents deallocationmem-unowned-crash - Unowned reference crashes after owner deallocationmem-notification-observer-leak - NotificationCenter observer retains closure after removal neededmem-combine-sink-retain - Combine sink retains self without cancellable storagemem-async-task-self-capture - Task captures self extending lifetime beyond expected scopedead-sync-on-main - DispatchQueue.main.sync from main thread deadlocks instantlydead-recursive-lock - Recursive lock acquisition on same serial queuedead-actor-reentrancy - Actor reentrancy produces unexpected interleavingdead-semaphore-in-async - Semaphore.wait() inside async context deadlocks thread pooldead-queue-hierarchy - Dispatch queue target hierarchy inversion deadlocksdead-mainactor-blocking - Blocking MainActor with synchronous heavy workasync-missing-cancellation - Missing Task.isCancelled check wastes resources after navigationasync-detached-task-leak - Detached task without cancellation handle leaks workasync-task-group-error - TaskGroup silently drops child task errorsasync-continuation-leak - CheckedContinuation never resumed leaks awaiting taskasync-actor-hop-starvation - Excessive MainActor hops in hot loop starve UI updatesasync-unsafe-sendable - @unchecked Sendable hides data race from compilerio-concurrent-file-write - Concurrent file writes corrupt data without coordinationio-coredata-cross-thread - CoreData NSManagedObject accessed from wrong threadio-swiftdata-background - SwiftData model accessed from wrong ModelContextio-plist-concurrent-mutation - UserDefaults concurrent read-write produces stale valuesio-filemanager-race - FileManager existence check then use is a TOCTOU raceio-keychain-thread-safety - Keychain access from multiple threads returns unexpected errorsmut-enumerate-and-mutate - Collection mutation during enumeration crashes at runtimemut-kvo-dealloc-crash - KVO observer not removed before deallocation crashesmut-index-out-of-bounds - Array index access without bounds check crashesmut-force-unwrap - Force unwrapping optional in production crashes on nilmut-enum-future-cases - Non-exhaustive switch crashes on unknown enum caseexhaust-unbounded-task-spawn - Unbounded task spawning in loop exhausts memoryexhaust-thread-explosion - GCD creates unbounded threads under concurrent loadexhaust-urlsession-leak - URLSession not invalidated leaks delegate and connectionsexhaust-file-descriptor-leak - File handle not closed leaks file descriptorsexhaust-memory-warning-ignored - Low memory warning ignored triggers Jetsam killobjc-unrecognized-selector - Missing @objc annotation crashes with unrecognized selectorobjc-nsnull-in-json - NSNull in decoded JSON collection crashes on accessobjc-bridge-type-mismatch - Swift/ObjC bridge type mismatch crashes at runtimeobjc-dynamic-dispatch - Missing dynamic keyword breaks method swizzlingRead individual reference files for detailed explanations and code examples:
| File | Description |
|---|---|
| references/_sections.md | Category definitions and ordering |
| assets/templates/_template.md | Template for new rules |
| metadata.json | Version and reference information |