What Lumi checks
58 proprietary rules across five engines, plus axe-core and HTML_CodeSniffer. Every check mapped to WCAG criteria.
350+
Total rules
58
Proprietary rules
26
Unique to Lumi
Lumi Custom Checks
58 DOM rules that catch issues axe-core and WAVE miss.
Heading Structure
(3)| Rule | Impact |
|---|---|
More than one <h1> on the page lumi-multiple-h1Advisory | Moderate |
Heading level skipped (e.g. h2 → h4) lumi-heading-skip | Moderate |
Heading element with no text content lumi-empty-heading | Moderate |
Link Quality
(1)| Rule | Impact |
|---|---|
Generic link text ('click here', 'read more') with no aria label lumi-generic-link-text | Serious |
Alt Text Quality
(5)| Rule | Impact |
|---|---|
Alt text that looks like a filename or placeholder lumi-suspicious-alt-text | Serious |
Alt text under 5 characters lumi-alt-too-shortAdvisory | Moderate |
Alt text over 200 characters lumi-alt-too-longAdvisory | Minor |
Alt text duplicates nearby visible text lumi-alt-redundantAdvisory | Moderate |
Three or more images share identical alt text lumi-duplicate-alt-textAdvisory | Moderate |
Language
(1)| Rule | Impact |
|---|---|
Invalid html lang code lumi-invalid-lang | Serious |
Landmarks & Page Structure
(7)| Rule | Impact |
|---|---|
Two or more navs, one without an accessible label lumi-nav-without-label | Moderate |
Page has no <main> landmark lumi-missing-main | Serious |
Significant content (40+ chars) outside any landmark lumi-content-outside-landmarkAdvisory | Moderate |
Page has no <header>/banner landmark lumi-missing-headerUniqueAdvisory | Moderate |
Search field not inside a search landmark lumi-missing-search-landmarkUniqueAdvisory | Moderate |
Duplicate landmarks, one unlabelled lumi-duplicate-landmark-no-labelUnique | Moderate |
<main> nested inside aside/nav lumi-landmark-nestingUnique | Serious |
Non-Text Contrast
(3)| Rule | Impact |
|---|---|
Button border/background under 3:1 against adjacent background lumi-button-contrastUniqueAdvisory | Serious |
Form field border under 3:1 against background lumi-input-contrastUniqueAdvisory | Serious |
Custom checkbox/radio border under 3:1 lumi-custom-checkbox-contrastUniqueAdvisory | Serious |
ARIA Validation
(8)| Rule | Impact |
|---|---|
aria-label is empty or whitespace lumi-empty-aria-label | Serious |
aria-labelledby/describedby points to a missing id lumi-broken-aria-reference | Serious |
Invalid aria-live value lumi-aria-live-invalid | Serious |
role=alert/status combined with aria-live=off lumi-aria-live-conflict | Serious |
Abstract ARIA role used in markup lumi-abstract-roleUnique | Serious |
Role duplicates an element's implicit semantics lumi-redundant-roleUnique | Minor |
Interactive role with no tabindex lumi-interactive-role-not-focusableUnique | Serious |
div/span role=button without tabindex lumi-div-button-no-keyboardUnique | Critical |
Forms & Input
(7)| Rule | Impact |
|---|---|
Personal-data field with no autocomplete attribute lumi-missing-autocompleteAdvisory | Moderate |
Field with no programmatic label lumi-label-not-associatedAdvisory | Serious |
'*'/required text but no required/aria-required lumi-required-not-programmaticAdvisory | Serious |
Red border with no text/ARIA error indication lumi-colour-only-errorAdvisory | Serious |
Password field blocks paste (breaks password managers) lumi-paste-blocked | Serious |
Password field missing autocomplete attribute lumi-auth-autocompleteAdvisory | Moderate |
CAPTCHA with no accessible alternative lumi-captcha-no-altAdvisory | Critical |
Tables
(4)| Rule | Impact |
|---|---|
Data table with no <th> header cells lumi-table-no-headers | Serious |
Header cells missing scope attributes lumi-table-missing-scopeAdvisory | Moderate |
Table with no caption or accessible label lumi-table-no-captionAdvisory | Moderate |
Rows with inconsistent column counts lumi-table-broken-structure | Moderate |
Media, Motion & Other
(5)| Rule | Impact |
|---|---|
Interactive element under 24×24px lumi-small-touch-targetAdvisory | Moderate |
Animates despite prefers-reduced-motion lumi-no-reduced-motionAdvisory | Moderate |
Autoplaying media that is not muted lumi-autoplay-media | Serious |
outline:none with no focus fallback lumi-outline-removedAdvisory | Serious |
Viewport blocks zoom (user-scalable=no) lumi-zoom-disabled | Critical |
Structure Advisor
(3)| Rule | Impact |
|---|---|
Nav with 3+ links but no <ul> lumi-structure-nav-without-listUniqueAdvisory | Minor |
<main> contains no heading lumi-structure-heading-landmark-mismatchUniqueAdvisory | Minor |
Landmarks not in conventional order lumi-structure-landmark-orderUniqueAdvisory | Minor |
Keyboard Interaction Tests
7 real-browser tests using Playwright. Most scanners analyse the DOM only - Lumi actually tabs through the page and tests keyboard navigation.
| Rule | Impact |
|---|---|
Focused element hidden by a sticky/fixed bar lumi-focus-obscuredUniqueAdvisory | Serious |
Tab gets stuck with no escape keyboard-trapUnique | Critical |
No visible focus indicator on a focused element focus-visibleUnique | Serious |
No skip-navigation link found skip-linkUniqueAdvisory | Moderate |
Skip link points to a missing id skip-link-targetUnique | Serious |
onclick/role element with no tabindex keyboard-accessibleUniqueAdvisory | Critical |
Focus order doesn't match visual layout tab-orderUniqueAdvisory | Moderate |
AI-Powered Checks
Computed visual analysis that detects issues requiring understanding of how elements actually render - not just what the HTML says.
| Rule | Impact |
|---|---|
Text placed over a background image/gradient lumi-ai-contrast-bgimageUniqueAdvisory | Serious |
Text cut off by ellipsis/line-clamp lumi-ai-text-truncatedUniqueAdvisory | Moderate |
Icon button with no accessible label lumi-ai-icon-only-buttonUniqueAdvisory | Serious |
Colour used as the only indicator of meaning (status dots etc.) lumi-ai-colour-onlyUniqueAdvisory | Serious |
Claude screenshot review (premium Deep Scan); human-reviewed before the client sees it lumi-ai-deepUniqueAdvisoryDeep Scan | Moderate |
Third-Party Engines
Every scan also runs axe-core (~84 rules, industry standard) and HTML_CodeSniffer (WCAG 2AA standard). Results are deduplicated across all engines so each issue is reported once with the most detailed information from whichever engine found it.