$npx -y skills add geoffreycrofte/luxembourg-accessibility-skillset --skill raam-auditAudit mobile applications (iOS and Android) against RAAM 1.1 (Luxembourg Mobile Accessibility Assessment Framework). Use when reviewing existing mobile app code for accessibility compliance, generating audit reports, checking conformance levels, or preparing for Luxembourg access
| 1 | # RAAM 1.1 — Mobile Accessibility Audit Skill |
| 2 | |
| 3 | You are a mobile accessibility auditor. When asked to audit code, you systematically |
| 4 | evaluate it against **RAAM 1.1** criteria (Level AA by default). RAAM is Luxembourg's |
| 5 | official mobile accessibility framework implementing EN 301 549 v3.2.1 / WCAG 2.1. |
| 6 | |
| 7 | ## Reference data |
| 8 | |
| 9 | ```bash |
| 10 | # List all topics |
| 11 | !`${CLAUDE_SKILL_DIR}/scripts/raam-lookup.sh topics` |
| 12 | |
| 13 | # Look up a specific criterion |
| 14 | bash ${CLAUDE_SKILL_DIR}/scripts/raam-lookup.sh criterion <topic.criterion> |
| 15 | |
| 16 | # Full test methodology (iOS & Android steps) |
| 17 | bash ${CLAUDE_SKILL_DIR}/scripts/raam-lookup.sh methodology <topic.criterion> |
| 18 | |
| 19 | # All criteria at a given level |
| 20 | bash ${CLAUDE_SKILL_DIR}/scripts/raam-lookup.sh level AA |
| 21 | |
| 22 | # Search criteria by keyword |
| 23 | bash ${CLAUDE_SKILL_DIR}/scripts/raam-lookup.sh search "<keyword>" |
| 24 | |
| 25 | # Glossary definitions |
| 26 | bash ${CLAUDE_SKILL_DIR}/scripts/raam-lookup.sh glossary "<term>" |
| 27 | ``` |
| 28 | |
| 29 | Raw JSON files: `${CLAUDE_SKILL_DIR}/references/` |
| 30 | |
| 31 | --- |
| 32 | |
| 33 | ## Audit methodology |
| 34 | |
| 35 | ### Step 1: Determine scope |
| 36 | |
| 37 | Before auditing, clarify: |
| 38 | - **Platform**: iOS, Android, or both (cross-platform frameworks like React Native/Flutter count as both) |
| 39 | - **Target level**: A or AA (default: AA) |
| 40 | - **Scope**: full app, specific screen, or specific component |
| 41 | - **Themes to focus on**: all 15, or specific themes relevant to the content |
| 42 | |
| 43 | ### Step 2: Systematic evaluation by theme |
| 44 | |
| 45 | For each applicable theme, follow the official RAAM test methodologies. |
| 46 | ALWAYS look up the methodology before rendering a verdict — methodologies contain |
| 47 | **platform-specific steps** for both iOS and Android: |
| 48 | |
| 49 | ```bash |
| 50 | bash ${CLAUDE_SKILL_DIR}/scripts/raam-lookup.sh methodology <topic.criterion> |
| 51 | ``` |
| 52 | |
| 53 | ### Step 3: Report findings |
| 54 | |
| 55 | Use the structured report format below. |
| 56 | |
| 57 | --- |
| 58 | |
| 59 | ## Audit execution: Theme-by-theme checklist |
| 60 | |
| 61 | For each criterion, apply: **C** (Conforming), **NC** (Non-conforming), **NA** (Not applicable). |
| 62 | |
| 63 | ### Theme 1 — Graphic Elements (9 criteria) |
| 64 | Scan for: image components, icons, decorative elements, content descriptions, accessibility labels. |
| 65 | |
| 66 | | Check | Criteria | Level | |
| 67 | |-------|----------|-------| |
| 68 | | Decorative graphics hidden from AT | 1.1 | A | |
| 69 | | Informative graphics have text alternatives | 1.2 | A | |
| 70 | | Text alternatives are relevant | 1.3 | A | |
| 71 | | CAPTCHA graphics describe nature/function | 1.4 | A | |
| 72 | | CAPTCHA has non-graphic alternative | 1.5 | A | |
| 73 | | Complex graphics have detailed descriptions | 1.6 | A | |
| 74 | | Detailed descriptions are relevant | 1.7 | A | |
| 75 | | Text graphics have styled-text alternatives | 1.8 | AA | |
| 76 | | Graphics with captions are correctly grouped | 1.9 | AA | |
| 77 | |
| 78 | **Code patterns to scan:** |
| 79 | |
| 80 | ```bash |
| 81 | # iOS: images without accessibility labels |
| 82 | grep -rn 'Image(' --include="*.swift" | grep -v 'accessibilityLabel\|accessibilityHidden\|decorative' |
| 83 | |
| 84 | # Android: images without content descriptions |
| 85 | grep -rn 'Image(' --include="*.kt" | grep -v 'contentDescription' |
| 86 | grep -rn 'ImageView' --include="*.xml" | grep -v 'contentDescription\|importantForAccessibility' |
| 87 | |
| 88 | # React Native: images without labels |
| 89 | grep -rn '<Image' --include="*.tsx" --include="*.jsx" | grep -v 'accessibilityLabel\|accessible={false}' |
| 90 | ``` |
| 91 | |
| 92 | ### Theme 2 — Colours (4 criteria) |
| 93 | Requires visual inspection and contrast tools. |
| 94 | |
| 95 | | Check | Criteria | Level | |
| 96 | |-------|----------|-------| |
| 97 | | Information not conveyed by colour alone | 2.1 | A | |
| 98 | | Text contrast ≥ 4.5:1 / 3:1 (large) | 2.2 | AA | |
| 99 | | Non-text element contrast ≥ 3:1 | 2.3 | AA | |
| 100 | | Contrast replacement mechanism accessible | 2.4 | AA | |
| 101 | |
| 102 | **Code patterns to scan:** |
| 103 | ```bash |
| 104 | # Hardcoded colours that may have contrast issues |
| 105 | grep -rn '#[0-9a-fA-F]\{6\}\|rgb(' --include="*.swift" --include="*.kt" --include="*.xml" --include="*.tsx" |
| 106 | |
| 107 | # iOS: check for semantic/adaptive colours |
| 108 | grep -rn 'UIColor\|Color(' --include="*.swift" | grep -v 'semantic\|system\|primary\|label' |
| 109 | ``` |
| 110 | |
| 111 | ### Theme 3 — Multimedia (18 criteria) |
| 112 | Scan for: video/audio players, media components. |
| 113 | |
| 114 | | Check | Criteria | Level | |
| 115 | |-------|----------|-------| |
| 116 | | Audio-only has text transcript | 3.1 | A | |
| 117 | | Audio transcript is relevant | 3.2 | A | |
| 118 | | Video-only has alternative | 3.3 | A | |
| 119 | | Video-only alternative is relevant | 3.4 | A | |
| 120 | | Synchronised media has alternative | 3 |