Automated accessibility scanning across the five engines - axe-core (primary), pa11y, Lighthouse a11y, WAVE, and IBM Equal Access. Authors and runs axe-core scans via the `axe.run()` JavaScript API or the @axe-core/playwright / @axe-core/cli wrappers, parses `violations[]` into per-rule severity, configures rule disable / disable-by-tag patterns, and emits CI-gateable output; references/ carry the pa11y CLI (htmlcs + axe runners), Lighthouse CI `categories:accessibility` assertions, the WAVE API / overlay, and IBM Equal Access (Section 508) with their verified CLI / API / config. Use for any automated a11y scanner setup - axe-core for JS/TS UI test suites on every PR, and the references for CLI-only, Lighthouse-pipeline, WebAIM-branded, or Section 508 scanning.
75
94%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
Companion reference for axe-a11y. Consult when the project ships to US
federal / public-sector customers under Section 508 procurement, when an
enterprise compliance program mandates IBM-branded reports, or to cross-check
axe results from Selenium / Puppeteer / Playwright suites. For most projects
without those constraints, direct axe (SKILL.md) is the standard
recommendation - larger ecosystem, simpler integration.
IBM Equal Access provides an accessibility-checker as part of the broader Equal Access Toolkit, supporting a11y across "planning, design, development, and verification phases" (equal-access). The differentiator vs. axe / pa11y / Lighthouse is US Section 508 specificity and IBM-branded enterprise rule sets.
npm install --save-dev accessibility-checker(Per equal-access.) Cypress uses the
cypress-accessibility-checker wrapper; Karma / Selenium / Puppeteer /
Playwright are bundled in accessibility-checker.
const { getCompliance } = require('accessibility-checker');
const results = await getCompliance(page, 'My scan label');
if (results.report.results.filter(r => r.level === 'violation').length > 0) {
process.exit(1);
}(Adapted from equal-access; page is a Puppeteer / Playwright
page.)
.achecker.yml)ruleArchive: latest
policies:
- WCAG_2_2
failLevels:
- violation
- potentialviolation
reportLevels:
- violation
- potentialviolation
- recommendation
outputFormat:
- json
- html
outputFolder: a11y-reportsPer equal-access:
| Policy | Coverage |
|---|---|
WCAG_2_0 | WCAG 2.0 baseline. |
WCAG_2_1 | WCAG 2.1 (adds mobile / vision-related SCs). |
WCAG_2_2 | WCAG 2.2 (adds auth + drag + target-size SCs). |
IBM_Accessibility | IBM's superset including beyond-WCAG rules. |
IBM_Accessibility_2_2_2 | IBM's WCAG-2.2-aligned set. |
US Section 508 alignment is via the IBM-branded policies (the toolkit's compliance documentation maps Section 508 to specific rule combinations).
getCompliance() returns a report with a summary.counts block and a
results[] array; each result carries ruleId (e.g. WCAG20_Img_HasAlt),
level, message, snippet, and a DOM path. Severity levels:
| Level | Severity |
|---|---|
violation | Definite WCAG failure. |
potentialviolation | Likely failure; needs manual review. |
recommendation | Best-practice improvement. |
potentialrecommendation | Likely improvement. |
manual | Requires manual review. |
For CI gating, fail on violation (and optionally potentialviolation);
aggregate the rest at the gate.
const { test, expect } = require('@playwright/test');
const { getCompliance } = require('accessibility-checker');
test('checkout passes IBM Equal Access', async ({ page }) => {
await page.goto('/checkout');
const results = await getCompliance(page, 'checkout-page');
const violations = results.report.results.filter(r => r.level === 'violation');
expect(violations).toHaveLength(0);
});For the ratchet pattern (block only on net-new violations), pipe the JSON
output to a11y-violation-gate instead of asserting zero.
| Anti-pattern | Why it fails | Fix |
|---|---|---|
Asserting violation count is 0 | Legacy debt blocks every PR. | a11y-violation-gate ratchet. |
| Mixing Equal Access with axe in the same gate | Same issue flagged twice under different rule IDs; noise. | Run separately; cross-check at audit time. |
IBM_Accessibility policy without justification | CI fails on issues that aren't conformance failures. | Default to WCAG_2_2; add IBM policies only for IBM-branded compliance. |
Skipping the manual level | Items needing human review go unreviewed. | Track manual count; human sign-off at release. |