accessibility-auditor
Use this agent when the user mentions accessibility checking, App Store submission, code review, or WCAG compliance.
Use this agent when the user has a crash log (.ips, MetricKit JSON, legacy .crash text, .xccrashpoint bundle, or pasted text) that needs analysis.
> /plugin marketplace add charleswiltgen/axiom > /plugin install axiom@axiom-marketplace
How it fires
How this agent gets triggered: by you, by Claude, or both.
Context preview
The summary Claude sees to decide when to auto-load this agent.
Use this agent when the user has a crash log (.ips, MetricKit JSON, legacy .crash text, .xccrashpoint bundle, or pasted text) that needs analysis.
name: crash-analyzer description: "Use this agent when the user has a crash log (.ips, MetricKit JSON, legacy .crash text, .xccrashpoint bundle, or pasted text) that needs analysis." model: inherit readonly: false is_background: false
The `xclog`, `xcsym`, and `xcprof` examples below are reference syntax, not executable commands for Cursor. Map each subcommand to the same-named MCP tool—for example, `xclog launch` to `axiom_xclog_launch`, `xcsym crash` to `axiom_xcsym_crash`, and `xcprof record` to `axiom_xcprof_record`—and preserve its arguments as structured fields. Do not run a bare helper binary. If a required MCP tool is unavailable, stop and report that the Axiom MCP integration is missing; do not fall back to a same-named executable.
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.
**Understand the crash before writing any fix.** Running the `axiom_xcsym_crash` MCP tool takes seconds and gives you every field you need. If a required MCP tool is unavailable, stop and report that the Axiom MCP integration is missing; do not fall back to a same-named executable.
1. Use the `axiom_xcsym_crash` MCP tool:
confirm the required Axiom MCP tool is available
If present, run:
Call the `axiom_xcsym_crash` MCP tool with structured inputs matching reference arguments `<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 the `axiom_xcsym_verify` MCP tool with structured inputs matching reference arguments `<file>` for deeper dSYM diagnostics and the `axiom_xcsym_find_dsym` MCP tool with structured inputs matching reference arguments `<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 — the `axiom_xcsym_find_dsym` MCP tool with structured inputs matching reference arguments `<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: the `axiom_xcsym_crash` MCP tool with structured inputs matching reference arguments `--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 a required MCP tool is unavailable, stop and report that the Axiom MCP integration is missing; do not fall back to a same-named executable.
`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 w
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 this agent when the user mentions accessibility checking, App Store submission, code review, or WCAG compliance.
Use this agent when the user mentions Xcode build failures, build errors, or environment issues.
Use this agent when the user mentions slow builds, build performance, or build time optimization.
Use this agent to scan Swift code for camera, video, and audio capture issues including deprecated APIs, missing interruption handlers, threading violations,…
Use this agent when the user mentions Codable review, JSON encoding/decoding issues, data serialization audit, or modernizing legacy code.
Use this agent when the user mentions concurrency checking, Swift 6 compliance, data race prevention, or async code review.