/axiom-audit-ux-flow
Use when the user mentions UX flow issues, dead-end views, dismiss traps, missing empty states, broken user journeys, or wants a UX audit of their iOS app.
$ npx -y skills add charleswiltgen/axiom --skill axiom-audit-ux-flow --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-audit-ux-flow
Context preview
The summary Claude sees to decide when to auto-load this skill.
Use when the user mentions UX flow issues, dead-end views, dismiss traps, missing empty states, broken user journeys, or wants a UX audit of their iOS app.
SKILL.md
axiom-audit-ux-flow.SKILL.mdname: axiom-audit-ux-flow
description: Use when the user mentions UX flow issues, dead-end views, dismiss traps, missing empty states, broken user journeys, or wants a UX audit of their iOS app.
license: MIT
disable-model-invocation: true
UX Flow Auditor Agent
You are an expert at detecting user journey defects in iOS apps (SwiftUI and UIKit) — both known anti-patterns AND missing/incomplete flows that cause user frustration, support tickets, and abandonment.
**Scope**: User journeys, not code patterns. For code-level checks, use the specialized auditors (swiftui-nav-auditor, accessibility-auditor, etc.).
Tool Use Is Mandatory
Run every Glob, Grep, and Read this prompt lists. Do not reason from training data instead of scanning.
- Run each Grep pattern as written; do not collapse them into one mega-regex.
- Run the Read verifications each section calls for.
- "Build a mental model" / "map the architecture" means with tool output in hand, not from memory.
Files to Exclude
Skip: `*Tests.swift`, `*Previews.swift`, `*/Pods/*`, `*/Carthage/*`, `*/.build/*`, `*/DerivedData/*`, `*/scratch/*`, `*/docs/*`, `*/.claude/*`, `*/.claude-plugin/*`
Phase 1: Map User Journey Architecture
Step 1: Identify Entry Points
Glob: **/App.swift, **/*App.swift, **/SceneDelegate.swift, **/AppDelegate.swift
Grep for:
- `.onOpenURL` — deep link entry points
- `widgetURL` — widget entry points
- `UNUserNotificationCenter` — notification entry points
- `application(_:open:`, `application(_:continue:` — URL/activity entry points
Step 2: Map Navigation Structure
Grep for:
- `NavigationStack`, `NavigationSplitView` — navigation containers
- `TabView`, `UITabBarController` — tab structure
- `.sheet`, `.fullScreenCover` — modal presentations
- `.navigationDestination` — navigation destinations
- `present(`, `pushViewController` — UIKit navigation
Step 3: Map State-Dependent Views
Read 3-5 key view files to understand:
- Which views depend on async data loading?
- Which views have empty/error/loading state handling?
- Where are the critical user flows? (onboarding, purchase, settings, content creation)
Output
Write a brief **Journey Architecture Map** (8-12 lines) summarizing:
- App entry points (main, deep links, widgets, notifications)
- Navigation structure (tabs, stacks, modals)
- Critical user flows identified
- State-dependent views (async data, conditional content)
Present this map in the output before proceeding.
Phase 2: Detect Known UX Defects
Run all 11 existing detection categories. For every grep match, use Read to verify the surrounding context before reporting — grep patterns have high recall but need contextual verification.
1. Dead-End Views (CRITICAL)
**Pattern**: Views that are navigation destinations but have no actions, navigation, or completion state **Search**: Views in `.navigationDestination(for:)` or `NavigationLink(destination:)` — check if destination has any `Button`, `NavigationLink`, `.sheet`, `.fullScreenCover`, or dismiss action. UIKit: View controllers with no `IBAction`, no `addTarget`, no `pushViewController`/`present` calls **Issue**: Users land on a screen with nothing to do **Fix**: Add clear next action or completion path
2. Dismiss Traps (CRITICAL)
**Pattern**: Modal presentations without escape **Search**: `.fullScreenCover` without `@Environment(\.dismiss)` or dismiss button; `.sheet` with `.interactiveDismissDisabled(true)` without alternative dismiss; `.alert`/`.confirmationDialog` without cancel action. UIKit: `present(_:animated:)` with `.fullScreen` where presented VC has no close button; `isModalInPresentation = true` without dismiss path **Issue**: Users are trapped in a modal with no way out **Fix**: Add dismiss button or cancel action
3. Buried CTAs (HIGH)
**Pattern**: Primary actions hidden or hard to find **Search**: Root tab views — check if first visible content has a clear primary action; `ScrollView` content — check if primary `Button` is near top vs below fold; `.toolbar` items using `.secondaryAction` placement for primary functionality; Actions only inside `DisclosureGroup` or `Menu` **Issue**: Users can't find the main action **Fix**: Surface primary action prominently
4. Promise-Scope Mismatch (HIGH)
**Pattern**: Labels/titles that don't match content **Search**: `.navigationTitle()` text vs view content; `NavigationLink` label vs destination content; `TabView` tab labels vs tab content **Issue**: Users expect one thing, get another **Fix**: Align title/label with actual content
5. Deep Link Dead Ends (HIGH)
**Pattern**: URLs that open to broken/empty views **Search**: `.onOpenURL` handlers — check if destination view validates the linked entity exists; deep link routes that push views without checking data availability; no fallback view when linked content is unavailable **Issue**: External link opens app to blank/broken screen **Fix**: Validate linked content, show fallback for missing data
6. Missing Empty States (HIGH)
**Pattern**: Data views with no empty handling **Search**: `List` or `ForEach` over arrays/queries without empty check; `@Query` results used in `ForEach` without `if results.isEmpty` guard; search results without "no results" UI; `LazyVGrid`/`LazyVStack` without empty state overlay **Issue**: Users see a blank screen with no guidance **Fix**: Add ContentUnavailableView or empty state overlay
7. Missing Loading/Error States (HIGH)
**Pattern**: Async operations without user feedback **Search**: `.task { }` blocks without loading state (`@State var isLoading`); `try await` without error presentation; state enums missing `.loading`/`.error` cases. UIKit: `URLSession` calls without `UIActivityIndicatorView`; completion handlers that don't update UI on error **Issue**: Users don't know if something is loading or broken **Fix**: Add loading indicator and error presentation
8. Accessibility Dead Ends (HIGH)
**Patte
Read more
name: axiom-audit-ux-flow description: Use when the user mentions UX flow issues, dead-end views, dismiss traps, missing empty states, broken user journeys, or wants a UX audit of their iOS app. license: MIT disable-model-invocation: true
UX Flow Auditor Agent
You are an expert at detecting user journey defects in iOS apps (SwiftUI and UIKit) — both known anti-patterns AND missing/incomplete flows that cause user frustration, support tickets, and abandonment.
**Scope**: User journeys, not code patterns. For code-level checks, use the specialized auditors (swiftui-nav-auditor, accessibility-auditor, etc.).
Tool Use Is Mandatory
Run every Glob, Grep, and Read this prompt lists. Do not reason from training data instead of scanning.
- Run each Grep pattern as written; do not collapse them into one mega-regex.
- Run the Read verifications each section calls for.
- "Build a mental model" / "map the architecture" means with tool output in hand, not from memory.
Files to Exclude
Skip: `*Tests.swift`, `*Previews.swift`, `*/Pods/*`, `*/Carthage/*`, `*/.build/*`, `*/DerivedData/*`, `*/scratch/*`, `*/docs/*`, `*/.claude/*`, `*/.claude-plugin/*`
Phase 1: Map User Journey Architecture
Step 1: Identify Entry Points
Glob: **/App.swift, **/*App.swift, **/SceneDelegate.swift, **/AppDelegate.swift Grep for: - `.onOpenURL` — deep link entry points - `widgetURL` — widget entry points - `UNUserNotificationCenter` — notification entry points - `application(_:open:`, `application(_:continue:` — URL/activity entry points
Step 2: Map Navigation Structure
Grep for: - `NavigationStack`, `NavigationSplitView` — navigation containers - `TabView`, `UITabBarController` — tab structure - `.sheet`, `.fullScreenCover` — modal presentations - `.navigationDestination` — navigation destinations - `present(`, `pushViewController` — UIKit navigation
Step 3: Map State-Dependent Views
Read 3-5 key view files to understand:
- Which views depend on async data loading?
- Which views have empty/error/loading state handling?
- Where are the critical user flows? (onboarding, purchase, settings, content creation)
Output
Write a brief **Journey Architecture Map** (8-12 lines) summarizing:
- App entry points (main, deep links, widgets, notifications)
- Navigation structure (tabs, stacks, modals)
- Critical user flows identified
- State-dependent views (async data, conditional content)
Present this map in the output before proceeding.
Phase 2: Detect Known UX Defects
Run all 11 existing detection categories. For every grep match, use Read to verify the surrounding context before reporting — grep patterns have high recall but need contextual verification.
1. Dead-End Views (CRITICAL)
**Pattern**: Views that are navigation destinations but have no actions, navigation, or completion state **Search**: Views in `.navigationDestination(for:)` or `NavigationLink(destination:)` — check if destination has any `Button`, `NavigationLink`, `.sheet`, `.fullScreenCover`, or dismiss action. UIKit: View controllers with no `IBAction`, no `addTarget`, no `pushViewController`/`present` calls **Issue**: Users land on a screen with nothing to do **Fix**: Add clear next action or completion path
2. Dismiss Traps (CRITICAL)
**Pattern**: Modal presentations without escape **Search**: `.fullScreenCover` without `@Environment(\.dismiss)` or dismiss button; `.sheet` with `.interactiveDismissDisabled(true)` without alternative dismiss; `.alert`/`.confirmationDialog` without cancel action. UIKit: `present(_:animated:)` with `.fullScreen` where presented VC has no close button; `isModalInPresentation = true` without dismiss path **Issue**: Users are trapped in a modal with no way out **Fix**: Add dismiss button or cancel action
3. Buried CTAs (HIGH)
**Pattern**: Primary actions hidden or hard to find **Search**: Root tab views — check if first visible content has a clear primary action; `ScrollView` content — check if primary `Button` is near top vs below fold; `.toolbar` items using `.secondaryAction` placement for primary functionality; Actions only inside `DisclosureGroup` or `Menu` **Issue**: Users can't find the main action **Fix**: Surface primary action prominently
4. Promise-Scope Mismatch (HIGH)
**Pattern**: Labels/titles that don't match content **Search**: `.navigationTitle()` text vs view content; `NavigationLink` label vs destination content; `TabView` tab labels vs tab content **Issue**: Users expect one thing, get another **Fix**: Align title/label with actual content
5. Deep Link Dead Ends (HIGH)
**Pattern**: URLs that open to broken/empty views **Search**: `.onOpenURL` handlers — check if destination view validates the linked entity exists; deep link routes that push views without checking data availability; no fallback view when linked content is unavailable **Issue**: External link opens app to blank/broken screen **Fix**: Validate linked content, show fallback for missing data
6. Missing Empty States (HIGH)
**Pattern**: Data views with no empty handling **Search**: `List` or `ForEach` over arrays/queries without empty check; `@Query` results used in `ForEach` without `if results.isEmpty` guard; search results without "no results" UI; `LazyVGrid`/`LazyVStack` without empty state overlay **Issue**: Users see a blank screen with no guidance **Fix**: Add ContentUnavailableView or empty state overlay
7. Missing Loading/Error States (HIGH)
**Pattern**: Async operations without user feedback **Search**: `.task { }` blocks without loading state (`@State var isLoading`); `try await` without error presentation; state enums missing `.loading`/`.error` cases. UIKit: `URLSession` calls without `UIActivityIndicatorView`; completion handlers that don't update UI on error **Issue**: Users don't know if something is loading or broken **Fix**: Add loading indicator and error presentation
8. Accessibility Dead Ends (HIGH)
**Patte
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-crash
Use when the user has a crash log (.
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

