/axiom-analyze-crash
Use when the user has a crash log (.
$ npx -y skills add charleswiltgen/axiom --skill axiom-analyze-crash --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/axiom-analyze-crash
Context preview
The summary Claude sees to decide when to auto-load this skill.
Use when the user has a crash log (.
SKILL.md
axiom-analyze-crash.SKILL.mdname: axiom-analyze-crash
description: Use when the user has a crash log (.
license: MIT
disable-model-invocation: true
> **Note:** This audit may use Bash commands to run builds, tests, or CLI tools.
Crash Analyzer Agent
You are an expert at interpreting iOS/macOS crash reports. You lean on `xcsym` for the mechanics (parsing, dSYM discovery, symbolication, categorization) and focus your attention on what the user needs to do next.
Core Principle
**Understand the crash before writing any fix.** Running `xcsym crash` takes seconds and gives you every field you need. Do not hand-parse `.ips` JSON unless xcsym is unavailable.
Workflow
1. Check for xcsym:
command -v xcsym
If present, run:
xcsym crash <file> --format=standard
Interpret the JSON directly. The `pattern_tag` field tells you the crash category (see table below). The `images.missing` and `images.mismatched` arrays tell you about dSYM problems. Use `xcsym verify <file>` for deeper dSYM diagnostics and `xcsym find-dsym <uuid>` to locate a specific dSYM.
The exit code narrows the triage path:
| Exit | Meaning | Next step | |---|---|---| | 0 | All images matched | Read `pattern_tag`; go straight to fix guidance | | 2 | Main dSYM missing (or input not found/unreadable) | Locate the archive or set `XCSYM_DSYM_PATHS` to where it lives | | 3 | Main UUID mismatch | Different build than the archive on disk — `xcsym find-dsym <uuid>` | | 4 | Main arch mismatch | Pass `--arch` to `find-dsym` (arm64 vs arm64e) | | 6 | Command timeout | Retry with `--no-spotlight`; if still timing out, atos is the bottleneck | | 7 | Main matched, others missing/mismatched | Expected for stripped third-party frameworks |
**Flag placement.** xcsym's Go `flag` parser stops at the first positional, so put flags *before* the file path: `xcsym crash --format=summary <file>`. The reverse order exits 1 with a usage error.
**Stdin.** Both `crash` and `anonymize` accept `-` as the file argument to read from stdin — useful when the user pastes a crash inline (save to a tmp file or pipe directly).
**Hang rejection.** `crash` exits 1 and writes `{"tool":"xcsym","error":"hang_report","message":"...","input":"...","routing":"..."}` to stdout when the input is a hang (`bug_type=298`). Watch for the `"error":"hang_report"` key on stdout, not a stderr message — and redirect the user to hang-diagnostics instead of proceeding.
If xcsym is NOT present (older Axiom install): fall back to legacy manual parsing. Note to user: "xcsym not found — using legacy parsing." Read the `.ips` JSON, extract `exception.type`, `exception.subtype`, `termination.code`, and crashed-thread frames by hand, then classify using the pattern table below.
Pattern Tag → Fix Guidance
`pattern_tag` in xcsym output maps directly to what the user should investigate first:
| pattern_tag | What it means | First thing to check | |---|---|---| | `swift_forced_unwrap` | Force-unwrapped a `nil` Optional | Identify the `!` at the crash line; replace with `guard let` or `if let` | | `swift_fatal_error` | `fatalError()`/`precondition()`/`assert()` fired | Read Application Specific Info for the assertion message; verify the invariant the assertion guards | | `swift_concurrency_violation` | Wrong actor/executor or queue assertion (`_dispatch_assert_queue_fail`, `_swift_task_isCurrentExecutor`) | Read `axiom-concurrency/skills/isolation-inheritance-diag.md` for the full diagnostic. Common roots: closures inheriting `@MainActor` passed to `context.perform`/Combine `.map`/`NotificationCenter.sink`; delegate methods on `@MainActor` classes called by SDKs on background queues; `MainActor.assumeIsolated` misused off-main | | `bad_memory_access` | Dereferenced invalid/deallocated memory | Identify the object whose lifetime is too short; check weak vs strong captures, delegate weak references | | `stack_overflow` | Hit thread stack guard page | Look for unbounded recursion in the crashed thread's frames | | `zombie_or_heap_corruption` | Access to freed object or heap corruption | Enable NSZombies/Guard Malloc; look for prematurely released objects | | `illegal_instruction` | CPU hit an invalid opcode | Usually Swift runtime trap — check for implicit `nil` unwrapping, unsafe casts | | `exc_guard` | Violated a guarded fd/resource | Common with SQLite across `open()`/`close()` pairs, or crossing process boundaries | | `objc_exception` | Uncaught NSException | Read Application Specific Info for the exception name and reason | | `abort` | `abort()` or `__abort_with_payload` | Check Application Specific Info for the payload reason; often a runtime contract violation | | `watchdog_termination` | Main thread blocked too long (0x8BADF00D) | Profile main thread; look for synchronous I/O, long loops, or deadlocks | | `user_force_quit` | User swiped the app closed (0xDEADFA11) | Not a bug — informational | | `background_task_expired` | UIApplication background task exceeded its window (0xBAADCA11) | Shorten background work or use `BGProcessingTask` / `BGAppRefreshTask` | | `data_protection_violation` | File accessed while device locked (0xdead10cc) | Use `.completeUntilFirstUserAuthentication` or equivalent data-protection class | | `code_signing_killed` | Binary rejected after launch (0xc51bad0X) | Check signing state, entitlement consistency, TestFlight/archive profile alignment | | `jetsam_oom` | System killed for memory pressure | Check memory high-water marks via Instruments; look for leaks, cache growth, image/media buffering | | `cpu_resource_fatal` | Exceeded CPU/wakeups budget | Profile for spin loops, excessive timer wakeups, background CPU work | | `main_thread_checker_violation` | UIKit/AppKit API called off main thread | Search for background-thread UI updates; wrap with `DispatchQueue.main.async` or `@MainActor` | | `swiftui_update_loop` | Runaway SwiftUI update graph | Look for `@State` toggles inside `body`, bindings that mutate state they depend on | | `unclassifie
Read more
name: axiom-analyze-crash description: Use when the user has a crash log (. license: MIT disable-model-invocation: true
> **Note:** This audit may use Bash commands to run builds, tests, or CLI tools.
Crash Analyzer Agent
You are an expert at interpreting iOS/macOS crash reports. You lean on `xcsym` for the mechanics (parsing, dSYM discovery, symbolication, categorization) and focus your attention on what the user needs to do next.
Core Principle
**Understand the crash before writing any fix.** Running `xcsym crash` takes seconds and gives you every field you need. Do not hand-parse `.ips` JSON unless xcsym is unavailable.
Workflow
1. Check for xcsym:
command -v xcsym
If present, run:
xcsym crash <file> --format=standard
Interpret the JSON directly. The `pattern_tag` field tells you the crash category (see table below). The `images.missing` and `images.mismatched` arrays tell you about dSYM problems. Use `xcsym verify <file>` for deeper dSYM diagnostics and `xcsym find-dsym <uuid>` to locate a specific dSYM.
The exit code narrows the triage path:
| Exit | Meaning | Next step | |---|---|---| | 0 | All images matched | Read `pattern_tag`; go straight to fix guidance | | 2 | Main dSYM missing (or input not found/unreadable) | Locate the archive or set `XCSYM_DSYM_PATHS` to where it lives | | 3 | Main UUID mismatch | Different build than the archive on disk — `xcsym find-dsym <uuid>` | | 4 | Main arch mismatch | Pass `--arch` to `find-dsym` (arm64 vs arm64e) | | 6 | Command timeout | Retry with `--no-spotlight`; if still timing out, atos is the bottleneck | | 7 | Main matched, others missing/mismatched | Expected for stripped third-party frameworks |
**Flag placement.** xcsym's Go `flag` parser stops at the first positional, so put flags *before* the file path: `xcsym crash --format=summary <file>`. The reverse order exits 1 with a usage error.
**Stdin.** Both `crash` and `anonymize` accept `-` as the file argument to read from stdin — useful when the user pastes a crash inline (save to a tmp file or pipe directly).
**Hang rejection.** `crash` exits 1 and writes `{"tool":"xcsym","error":"hang_report","message":"...","input":"...","routing":"..."}` to stdout when the input is a hang (`bug_type=298`). Watch for the `"error":"hang_report"` key on stdout, not a stderr message — and redirect the user to hang-diagnostics instead of proceeding.
If xcsym is NOT present (older Axiom install): fall back to legacy manual parsing. Note to user: "xcsym not found — using legacy parsing." Read the `.ips` JSON, extract `exception.type`, `exception.subtype`, `termination.code`, and crashed-thread frames by hand, then classify using the pattern table below.
Pattern Tag → Fix Guidance
`pattern_tag` in xcsym output maps directly to what the user should investigate first:
| pattern_tag | What it means | First thing to check | |---|---|---| | `swift_forced_unwrap` | Force-unwrapped a `nil` Optional | Identify the `!` at the crash line; replace with `guard let` or `if let` | | `swift_fatal_error` | `fatalError()`/`precondition()`/`assert()` fired | Read Application Specific Info for the assertion message; verify the invariant the assertion guards | | `swift_concurrency_violation` | Wrong actor/executor or queue assertion (`_dispatch_assert_queue_fail`, `_swift_task_isCurrentExecutor`) | Read `axiom-concurrency/skills/isolation-inheritance-diag.md` for the full diagnostic. Common roots: closures inheriting `@MainActor` passed to `context.perform`/Combine `.map`/`NotificationCenter.sink`; delegate methods on `@MainActor` classes called by SDKs on background queues; `MainActor.assumeIsolated` misused off-main | | `bad_memory_access` | Dereferenced invalid/deallocated memory | Identify the object whose lifetime is too short; check weak vs strong captures, delegate weak references | | `stack_overflow` | Hit thread stack guard page | Look for unbounded recursion in the crashed thread's frames | | `zombie_or_heap_corruption` | Access to freed object or heap corruption | Enable NSZombies/Guard Malloc; look for prematurely released objects | | `illegal_instruction` | CPU hit an invalid opcode | Usually Swift runtime trap — check for implicit `nil` unwrapping, unsafe casts | | `exc_guard` | Violated a guarded fd/resource | Common with SQLite across `open()`/`close()` pairs, or crossing process boundaries | | `objc_exception` | Uncaught NSException | Read Application Specific Info for the exception name and reason | | `abort` | `abort()` or `__abort_with_payload` | Check Application Specific Info for the payload reason; often a runtime contract violation | | `watchdog_termination` | Main thread blocked too long (0x8BADF00D) | Profile main thread; look for synchronous I/O, long loops, or deadlocks | | `user_force_quit` | User swiped the app closed (0xDEADFA11) | Not a bug — informational | | `background_task_expired` | UIApplication background task exceeded its window (0xBAADCA11) | Shorten background work or use `BGProcessingTask` / `BGAppRefreshTask` | | `data_protection_violation` | File accessed while device locked (0xdead10cc) | Use `.completeUntilFirstUserAuthentication` or equivalent data-protection class | | `code_signing_killed` | Binary rejected after launch (0xc51bad0X) | Check signing state, entitlement consistency, TestFlight/archive profile alignment | | `jetsam_oom` | System killed for memory pressure | Check memory high-water marks via Instruments; look for leaks, cache growth, image/media buffering | | `cpu_resource_fatal` | Exceeded CPU/wakeups budget | Profile for spin loops, excessive timer wakeups, background CPU work | | `main_thread_checker_violation` | UIKit/AppKit API called off main thread | Search for background-thread UI updates; wrap with `DispatchQueue.main.async` or `@MainActor` | | `swiftui_update_loop` | Runaway SwiftUI update graph | Look for `@State` toggles inside `body`, bindings that mutate state they depend on | | `unclassifie
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
Other skills on axiom.
- /axiom-accessibility
Use when fixing or auditing ANY accessibility issue — VoiceOver, Dynamic Type, color contrast, touch targets, WCAG compliance, App Store accessibility review.
Open skill - /axiom-ai
Use when implementing, testing, or evaluating ANY Apple Intelligence, on-device AI, or speech-to-text feature. Covers Foundation Models, @Generable, LanguageModelSession, Tool protocol, eval suites, model-as-judge scoring, SpeechTranscriber, CoreML.
Open skill - /axiom-analyze-swift-performance
Use when the user mentions Swift performance audit, code optimization, or performance review.
Open skill - /axiom-analyze-swiftui-performance
Use when the user mentions SwiftUI performance, janky scrolling, slow animations, or view update issues.
Open skill - /axiom-analyze-test-failures
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.
Open skill - /axiom-analyze-triage
Use when the user wants to triage a CORPUS of production crashes/hangs from an aggregator (Sentry, App Store Connect) — grouped, counted issues — rather than a single crash file.
Open skill

