Audit apps and websites for WCAG 2.2 compliance, screen reader support, and inclusive design across Android, iOS, and Web
npx claudepluginhub cure-consulting-group/productengineeringskillsThis skill is limited to using the following tools:
Comprehensive WCAG 2.2 accessibility audit across Android, iOS, and Web platforms. Evaluates perceivability, operability, understandability, and robustness. Produces a scored compliance report with severity-ranked findings and actionable remediation guidance.
Generates design tokens/docs from CSS/Tailwind/styled-components codebases, audits visual consistency across 10 dimensions, detects AI slop in UI.
Records polished WebM UI demo videos of web apps using Playwright with cursor overlay, natural pacing, and three-phase scripting. Activates for demo, walkthrough, screen recording, or tutorial requests.
Delivers idiomatic Kotlin patterns for null safety, immutability, sealed classes, coroutines, Flows, extensions, DSL builders, and Gradle DSL. Use when writing, reviewing, refactoring, or designing Kotlin code.
Comprehensive WCAG 2.2 accessibility audit across Android, iOS, and Web platforms. Evaluates perceivability, operability, understandability, and robustness. Produces a scored compliance report with severity-ranked findings and actionable remediation guidance.
Before starting, gather project context silently:
PORTFOLIO.md if it exists in the project root or parent directories for product/team contextcat package.json 2>/dev/null || cat build.gradle.kts 2>/dev/null || cat Podfile 2>/dev/null to detect stackgit log --oneline -5 2>/dev/null for recent changesls src/ app/ lib/ functions/ 2>/dev/null to understand project structureBefore applying the WCAG framework, scan the codebase:
<img without alt= in *.tsx *.jsx *.htmlImage( without contentDescription in *.ktImage( without .accessibilityLabel in *.swift<input without associated <label or aria-labelTextField( without label parameter in Compose#[0-9a-fA-F]{6} in JSX)width.*[0-3][0-9]dp|height.*[0-3][0-9]dp in Compose (targets < 44dp)outline:\s*none|outline:\s*0 in CSS (removed focus indicators)tabIndex="-1" on interactive elementsReport violations with file:line before proceeding to full WCAG audit.
Execute all 9 steps in order. Do not skip steps. Do not summarize — audit.
Determine the scope before beginning. The scope dictates depth and breadth of every subsequent step.
| Scope | Description | Depth |
|---|---|---|
| Single Screen | One view/page in isolation | Deep — every element audited |
| Feature Flow | Multi-screen user journey (e.g., checkout, onboarding) | Deep — all screens plus transitions and state changes |
| Full App | Entire application | Broad — representative sampling per screen, deep on critical paths |
| Platform-Specific | Audit targeting one platform only (Android, iOS, or Web) | Deep — platform idioms and assistive tech fully tested |
If scope is unclear, ask before proceeding. For full app audits, identify critical user journeys first and prioritize those.
Collect the following before auditing:
| Input | Required | Notes |
|---|---|---|
| Platform(s) | Yes | Android, iOS, Web, or combination |
| Target WCAG Level | Yes | AA (minimum) or AAA — default to AA if unspecified |
| Assistive tech requirements | Yes | TalkBack, VoiceOver, Switch Access, Voice Control, screen magnifiers |
| User demographics | Optional | Age range, known disabilities, locale/language considerations |
| Design system/component library | Optional | Helps identify systemic vs. one-off issues |
| Previous audit results | Optional | Baseline for regression tracking |
If target WCAG level is not specified, default to WCAG 2.2 Level AA. This is the legally required standard in most jurisdictions and the only defensible baseline.
Every piece of information and UI component must be presentable to users in ways they can perceive.
role="none", importantForAccessibility=no, isAccessibilityElement=false)sp units for text, never dp or pxrem, em, %) — no px for font sizes<th>, scope, headers attributes)All UI components and navigation must be operable by all users regardless of input method.
outline: none without replacementh1 > h2 > h3, no skipped levels)pointer-events: none is not used to block interaction on elements that should be interactiveprefers-reduced-motion (Web) / system reduce-motion settings (iOS/Android)Information and UI operation must be understandable.
lang attribute, Locale configuration)lang attribute on inline elements)autocomplete, textContentType, autofillHints)Content must be robust enough to be interpreted by a wide variety of assistive technologies.
<nav>, <main>, <header>, <footer>, <article>, <section>, <aside>)role="banner", role="navigation", role="main", role="contentinfo")<button role="link">)aria-* attributes are valid for the element's rolearia-label, aria-labelledby, aria-describedby references point to existing elementsaria-live appropriately (polite for updates, assertive for errors)aria-hidden="true" is never applied to focusable elementsaria-expanded, aria-pressed, aria-checked correctlyTest the following combinations at minimum:
| Platform | Screen Reader | Browser/Environment |
|---|---|---|
| Android | TalkBack | Native app |
| iOS | VoiceOver | Native app |
| Web (Desktop) | NVDA | Chrome |
| Web (Desktop) | VoiceOver | Safari |
| Web (Mobile) | TalkBack | Chrome Android |
| Web (Mobile) | VoiceOver | Safari iOS |
For each combination, verify:
contentDescription set on all meaningful ImageView, ImageButton, and icon-only viewsimportantForAccessibility set to no on decorative elements and layout wrappersModifier.semantics {} with contentDescription, stateDescription, roleModifier.clearAndSetSemantics {} to prevent duplicate announcements from child elementsmergeDescendants = true for logically grouped content (e.g., list items)semantics { customActions = listOf(...) }android:accessibilityLiveRegion for dynamic content (snackbars, counters, status updates)Modifier.sizeIn(minWidth = 48.dp, minHeight = 48.dp) or minimumInteractiveComponentSize()Modifier.semantics { heading() } on section headings for TalkBack heading navigationaccessibilityLabel set on all meaningful UI elements — concise, descriptive, no redundant type info ("Play" not "Play button")accessibilityHint for non-obvious actions ("Double-tap to start playback")accessibilityTraits correctly assigned (.button, .header, .selected, .adjustable, .image)UIFontMetrics or SwiftUI .font(.body) text styles; test at Accessibility sizes (AX1-AX5).accessibilityLabel(), .accessibilityValue(), .accessibilityHint().accessibilityElement(children: .combine) for logical grouping.accessibilityAddTraits(), .accessibilityRemoveTraits().accessibilityAction() for custom actions.accessibilitySortPriority() to control reading order.accessibilityHidden() for decorative elementsisAccessibilityElement, accessibilityElements, accessibilityElementsHiddenUIAccessibilityPostNotification for dynamic content changes (.screenChanged, .layoutChanged, .announcement)UIAccessibility.isReduceMotionEnabled / @Environment(\.accessibilityReduceMotion)UIAccessibility.isBoldTextEnabledaccessibilityIgnoresInvertColors = true<button>, <a>, <input>, <select>, <textarea> — never <div onclick><header>, <nav>, <main>, <aside>, <footer> present on every pagetabindex="0" only on elements that need to be focusable but are not nativelytabindex="-1" for programmatic focus (e.g., error summary, modal container)tabindex > 0focus-visible for keyboard-only focus styles<img> has alt attribute — meaningful alt for content images, alt="" for decorative<label> with for attribute on every input; fieldsets with legends for radio/checkbox groupsaria-live="polite" for status updates, aria-live="assertive" for errors and alerts@media (prefers-reduced-motion: reduce) disables non-essential animationsRun automated tools as a supplement to manual testing. Automated tools catch approximately 30-40% of accessibility issues. Manual testing is non-negotiable.
AccessibilityChecks.enable() in UI testsMissingContentDescription, ClickableViewAccessibility, LabelForcomposeTestRule.onNode(hasContentDescription(...)) assertionsXCTAssertTrue(element.isAccessibilityElement)try app.performAccessibilityAudit()═══════════════════════════════════════════════════════════════
ACCESSIBILITY AUDIT REPORT
Feature/Screen: [NAME]
Date: [TODAY]
Target Standard: WCAG 2.2 Level [AA/AAA]
Platform(s): [Android / iOS / Web]
═══════════════════════════════════════════════════════════════
COMPLIANCE SUMMARY SCORECARD
┌──────────────────────────┬─────────┬─────────┬─────────┬────────┬────────┐
│ WCAG Principle │ Android │ iOS │ Web │ Score │ Status │
├──────────────────────────┼─────────┼─────────┼─────────┼────────┼────────┤
│ 1. Perceivable │ X/10 │ X/10 │ X/10 │ X/30 │ pass/fail │
│ 2. Operable │ X/10 │ X/10 │ X/10 │ X/30 │ pass/fail │
│ 3. Understandable │ X/10 │ X/10 │ X/10 │ X/30 │ pass/fail │
│ 4. Robust │ X/10 │ X/10 │ X/10 │ X/30 │ pass/fail │
├──────────────────────────┼─────────┼─────────┼─────────┼────────┼────────┤
│ OVERALL │ X/40 │ X/40 │ X/40 │ X/120 │ │
└──────────────────────────┴─────────┴─────────┴─────────┴────────┴────────┘
Scoring: PASS >= 80% | CONDITIONAL 60-79% | FAIL < 60%
CRITICAL FINDINGS (block release — must fix before ship)
Severity: Critical — These issues make content completely inaccessible to one or more user groups.
1. [Platform] — [WCAG SC X.X.X] — [Finding] — [Element/File] — [Remediation]
MAJOR FINDINGS (fix before next release)
Severity: Major — These issues create significant barriers but do not completely block access.
1. [Platform] — [WCAG SC X.X.X] — [Finding] — [Element/File] — [Remediation]
MINOR FINDINGS (fix in backlog)
Severity: Minor — These issues cause inconvenience but do not prevent task completion.
1. [Platform] — [WCAG SC X.X.X] — [Finding] — [Element/File] — [Remediation]
SCREEN READER TEST RESULTS
┌────────────────┬──────────────┬──────────┬─────────────────────────────┐
│ Platform │ Screen Reader│ Result │ Notes │
├────────────────┼──────────────┼──────────┼─────────────────────────────┤
│ Android │ TalkBack │ pass/fail│ │
│ iOS │ VoiceOver │ pass/fail│ │
│ Web (Desktop) │ NVDA/Chrome │ pass/fail│ │
│ Web (Desktop) │ VO/Safari │ pass/fail│ │
│ Web (Mobile) │ TalkBack │ pass/fail│ │
│ Web (Mobile) │ VoiceOver │ pass/fail│ │
└────────────────┴──────────────┴──────────┴─────────────────────────────┘
AUTOMATED TOOL RESULTS
- axe-core: X violations / X passes
- Lighthouse Accessibility: XX/100
- Android Accessibility Scanner: X suggestions
- Xcode Accessibility Inspector: X warnings
PLATFORM-SPECIFIC ISSUES
1. [Platform] — [Issue] — [Component/File] — [Fix]
CROSS-PLATFORM CONSISTENCY ISSUES
1. [Behavior that differs across platforms] — [Impact on users] — [Fix]
REMEDIATION PRIORITY MATRIX
┌──────────┬──────────────┬──────────────────┬───────────────────────────┐
│ Priority │ Severity │ Timeline │ Action │
├──────────┼──────────────┼──────────────────┼───────────────────────────┤
│ P0 │ Critical │ Before release │ Block deployment │
│ P1 │ Major │ Next sprint │ Schedule immediately │
│ P2 │ Minor │ Within quarter │ Add to backlog │
└──────────┴──────────────┴──────────────────┴───────────────────────────┘
RECOMMENDATIONS
- [Architectural, process, or tooling improvement for long-term accessibility]
NEXT ACTIONS CHECKLIST
[ ] Fix all CRITICAL findings before release
[ ] Schedule all MAJOR findings for next sprint
[ ] Add all MINOR findings to backlog with ticket references
[ ] Re-run automated tools after fixes to verify resolution
[ ] Conduct manual screen reader re-test on fixed components
[ ] Update component library / design system with accessibility fixes
[ ] Add accessibility checks to CI pipeline if not already present
═══════════════════════════════════════════════════════════════