Builds a CI gate that fails the build on **new** WCAG / a11y violations introduced by a PR while grandfathering pre-existing violations on a per-rule / per-page baseline. Aggregates verdicts from axe-core / pa11y / Lighthouse a11y / WAVE / IBM Equal Access scans. Use when a project has accumulated a11y debt and a strict "zero violations" gate would block every PR - the ratchet pattern lets the team ship while preventing regressions.
79
99%
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
Detail moved out of SKILL.md to keep the core gate script lean. The runnable gate (axe-core ingestion) is in SKILL.md Step 3; extend it to the other four scanners using the shapes below, then emit the PR artifact with the template at the end of this file.
| Scanner | Native output |
|---|---|
| axe-core | JSON with violations[]; rule ID, impact, nodes. |
| pa11y | JSON with issues[]; code (WCAG SC), type. |
| Lighthouse a11y | LHR JSON with categories.accessibility.audits. |
| WAVE | JSON via WebAIM API; categories with errors / warnings. |
| IBM Equal Access | JSON with results[]. |
Each scanner is read the same way as axe-core: pull its findings
array (the second column above), map its native fields onto the
unified record {scanner, rule_id, wcag_sc, page_url, selector, severity}, and build the same fingerprint
f"{scanner}::{rule_id}::{page_url}::{selector}". A finding whose
fingerprint reappears on the next run is the same violation; a new
fingerprint is a new violation.
Render for $GITHUB_STEP_SUMMARY or a PR comment:
# A11y Gate - verdict: NO-GO
**Blockers (NEW violations): 2**
| Scanner | Rule | WCAG SC | Page | Selector | Severity |
|---------|-------------------|---------|--------------|---------------------|----------|
| axe | color-contrast | 1.4.3 | /checkout | button.primary | serious |
| axe | aria-required-attr | 4.1.2 | /checkout | div[role="dialog"] | critical |
**Warnings (NEW moderate): 1**
| Scanner | Rule | WCAG SC | Page | Selector |
|---------|---------------|---------|--------------|----------|
| pa11y | landmark-one-main | 1.3.1 | /checkout | (page-level) |
**Grandfathered (in baseline): 47**
**Fixed since baseline: 5** (positive trend)
## Recommended next step
Block-tier violations must be fixed in this PR. To address the
two blockers:
- `button.primary` on `/checkout`: contrast ratio 3.8:1; needs >=4.5:1.
- `div[role="dialog"]`: missing `aria-labelledby` or `aria-label`.A no-go verdict exits non-zero so CI halts.