accessibility-auditor
Use this agent when the user mentions accessibility checking, App Store submission, code review, or WCAG compliance.
Use this agent for closed-loop test debugging - automatically analyzes test failures, suggests fixes, and re-runs tests until passing.
> /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 for closed-loop test debugging - automatically analyzes test failures, suggests fixes, and re-runs tests until passing.
name: test-debugger description: "Use this agent for closed-loop test debugging - automatically analyzes test failures, suggests fixes, and re-runs tests until passing." model: inherit readonly: false is_background: false
> The source PreToolUse hook for `Bash` is advisory in Cursor, not an enforceable permission boundary. Before deleting `.xcresult` test results with `rm -rf`, warn: "About to delete test results."
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 closed-loop test debugging - running tests, analyzing failures, applying fixes, and iterating until tests pass.
**Closed-loop debugging flow:**
RUN → CAPTURE → ANALYZE → SUGGEST → FIX → VERIFY → REPORT ↑ | └──────────────── (if still failing) ─────────┘
# Get booted simulator BOOTED_UDID=$(xcrun simctl list devices -j | jq -r '.devices | to_entries[] | .value[] | select(.state == "Booted") | .udid' | head -1) # Create result bundle RESULT_PATH="/tmp/debug-test-$(date +%s).xcresult" # Run specific failing tests xcodebuild test \ -scheme "<SCHEME_NAME>UITests" \ -destination "platform=iOS Simulator,id=$BOOTED_UDID" \ -resultBundlePath "$RESULT_PATH" \ -only-testing:"<TARGET>/<TestClass>/<testMethod>" \ > /tmp/xcodebuild-debug.log 2>&1 # Redirect to a file — never pipe xcodebuild through `tee`/`grep`/`tail` (a pipe orphans # the build if interrupted; see iOS-9). Structured results come from $RESULT_PATH below. echo "Results: $RESULT_PATH"
# Export failure attachments
ATTACHMENTS_DIR="/tmp/debug-failures-$(date +%s)"
mkdir -p "$ATTACHMENTS_DIR"
xcrun xcresulttool export attachments \
--path "$RESULT_PATH" \
--output-path "$ATTACHMENTS_DIR" \
--only-failures
# Read manifest
cat "$ATTACHMENTS_DIR/manifest.json" | jq '.attachments[] | {name, testName, uniformTypeIdentifier}'
# Get console logs
xcrun xcresulttool get log --path "$RESULT_PATH" --type console > "$ATTACHMENTS_DIR/console.log"
# Get detailed test results
xcrun xcresulttool get test-results tests --path "$RESULT_PATH" > "$ATTACHMENTS_DIR/test-results.txt"Before running UI-failure pattern recognition, check whether the test produced a crash artifact. A crash needs symbolication first — surface error messages from `xcodebuild` point at the test harness, not the actual crash site.
# Any .ips produced during or just after the test run? ls -lt ~/Library/Logs/DiagnosticReports/*.ips 2>/dev/null | head -5 # Full triage — pattern_tag + symbolicated crashed thread in one call Call the `axiom_xcsym_crash` MCP tool with structured inputs matching reference arguments `--format=summary <path-to-ips>`.
Feed the returned `pattern_tag` to the fix plan:
| pattern_tag | Action | |---|---| | `swift_forced_unwrap` | Inspect the force-unwrap site — usually a test helper or mock returning nil | | `swift_concurrency_violation` | `@MainActor` state touched off the main actor (route to axiom-concurrency) | | `swift_fatal_error` | Production code hit a `precondition`/`fatalError` under the test's input | | `jetsam_oom` | Test suite accumulated memory — add `.serialized` trait or reset shared state | | `objc_exception` | NSException from a framework — read `crashed_thread.frames` for the origin |
If xcsym returns exit 2/3 ("main dSYM missing / UUID mismatch"), the crash came from a build xcsym can't find — build Debug against the same commit and retry.
| Pattern | Error Message | Root Cause | Fix | |---------|---------------|------------|-----| | **Element Not Found (test bug)** | `Failed to find element` | Wrong query or missing accessibilityIdentifier | Fix query or add identifier | | **Element Not Found (app bug)** | `Failed to find element` | Element never implemented or in wrong view | Report: app code needs this element — do NOT rewrite test | | **Timeout** | `Timed out waiting for element` | Slow app, short timeout | Increase timeout, optimize app | | **State Mismatch** | `Expected X, got Y` | Race condition | Add explicit wait | | **Not Hittable** | `Element exists but not hittable` | Element obscured | Dismiss keyboard/sheet, scroll | | **Stale Element** | `Element no longer attached` | View refreshed | Re-query element | | **Wrong Query** | `Multiple matches found` | Ambiguous query | Use more specific identifier |
# 1. Analyze failure screenshot FIRST # (Read the exported screenshot - you're multimodal) # Confirm: does the expected element appear in the UI? # 2. Check error message grep -A5 "Failure:" /tmp/xcodebuild-debug.log # 3. Find file and line grep -E "\.swift:[0-9]+" /tmp/xcodebuild-debug.log # 4. Read the test code # (Use Read tool on the file:line from above)
When a test can't find a UI element, determine whether the problem is in the test or the app BEFORE suggesting fixes:
1. **Check the screenshot** — Is the expected element visible anywhere on screen? 2. **If element is NOT visible**: Search the app source code for the element (grep for the expected text, identifier, or view name)
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.