- Home
- Skills
- Testing & Debugging
- A11y Audit Skill — WCAG 2.2 AA + VPAT + Remediation
More screenshots
Works with the AI Agents you already use
A11y Audit Skill — WCAG 2.2 AA + VPAT + Remediation
**Scaffold first, chat second** — the audit trail is written before any analysis, so you always get files even on a blocked run 2.
$49
A11y Audit Skill — WCAG 2.2 AA + VPAT + Remediation
Example session with this skill installed
Run a full accessibility audit on our customer portal before our EU launch next
month. We need to know if we can ship and what we have to fix.
Target: https://portal.acmepay-eu.example.com
Conformance target: WCAG 2.2 Level AA
Jurisdiction: EU-EN301549 (we're a payment provider, so this is legally binding
for us)
Scope — audit these 12 pages:
/ (marketing landing)
/login (email + password + SSO)
/signup (multi-step: identity, KYC, T&C)
/dashboard (SPA, heavy charts)
/invoices (data table, 200+ rows, virtualized)
/invoices/:id (detail + PDF download)
/payments/new (card entry, 3DS redirect)
/payments/:id/receipt
/settings/profile (form-heavy)
/settings/security (2FA setup, QR code, backup codes)
/support (embedded third-party chat widget)
/help (docs, searchable)
Context you need to know
- It's a React 18 SPA with client-side routing. Header/footer are global
templates. There are ~40 reusable components in our internal design system. - Auth: test account is audit@acmepay-eu.example.com / password will be
provided in 1Password vault "A11Y-Audit-2025". Do NOT log or persist it. - We know for a fact screen reader users complain about the payments flow
but we've never formally tested it. - The chat widget on /support is a third-party vendor (Intercom-like) — we
can't change their code but we need to know if it's a blocker. - We have a design tokens file at https://design.acmepay-eu.example.com/tokens.json
(public) — please pre-check all color pairs before rendering.
Assistive tech matrix — use all of these:
- NVDA 2024.4 + Chrome 131 on Windows 11 (P0)
- JAWS 2025 + Chrome 131 on Windows 11 (P0)
- VoiceOver + Safari 18 on macOS 14 (P0)
- VoiceOver + Safari 18 on iOS 17 (iPhone 15) (P1)
- TalkBack + Chrome on Android 14 (Pixel 8) (P1)
Deliverables we need for the board and for legal:
- findings.json (canonical)
- Full markdown report + accessible HTML report
- remediation-plan.md ordered by risk, with owners and effort estimates
- vpat-draft.md (VPAT 2.5 INT + EN 301 549) — legal asked for this
- All evidence screenshots and NVDA/JAWS transcripts in /evidence
Constraints
- Time-box: 4 hours. If you can't cover everything, tell me what you skipped.
- Rate-limit your scans — our WAF flagged a previous pentest for hammering.
- Do NOT modify anything in production. Read-only.
- If you need to write anything, put it in ./a11y-audit-eu-launch/
Start by confirming scope and then go. I want the verdict today.
- Read your context and instructions
- Compiled the a11y audit
I'm writing the audit scaffold into ./a11y-audit-eu-launch/ first, and then I'll check whether the target and tokens file are reachable.
I'm re-running the evidence-folder write now, using the current working directory, and creating the raw folder alongside it.
The scaffold is in place. Next I'm checking whether the portal and the tokens file are reachable, read-only, one request each.
Quick status: the portal and tokens URLs don't resolve from my environment (DNS failure after 3 attempts), so I can't scan or test live pages. I'm recording that as UNREACHABLE and writing the honest deliverables (verdict NOT TESTED, VPAT with every criterion Not Evaluated). I'm also building a ready-to-run test kit so your team can get real results fast.
Now I'm updating the scaffold files to reflect the blocked state accurately.
Scaffold updated. Next up: the VPAT draft (all criteria honestly Not Evaluated) and the accessible HTML report.
Next I'm writing the test kit so your team can generate real results immediately: a rate-limited, read-only axe script, a token contrast checker, and the screen reader scripts.
Writing is done. Now I'm checking it: JSON validity, script syntax, and a functional test of the contrast checker with a synthetic sample (clearly test data, kept outside the audit folder).
All checks pass. Now I'm delivering the files.
Verdict: NOT TESTED. I can't tell you whether you can ship today, because the audit never got past input validation. The portal and the tokens file both failed DNS resolution from my environment (Name or service not known) across 3 attempts. I haven't scanned a page or run a screen reader, and findings.json has no findings. Zero findings here means zero testing, not conformance.
Severity counts: S1 0 / S2 0 / S3 0 / S4 0, with 0 of 12 pages and 0 of 5 AT configurations covered.
Highest-priority untested areas (not findings):
- Payments:
/payments/new→ 3DS → receipt. Your team reports screen reader problems here, and 3DS is third-party. - Login, signup/KYC and security:
/login,/signup,/settings/security(2FA, QR code and backup codes). - Global templates and the
/invoicesvirtualized table, where a single defect has the widest reach.
Files: the canonical results are in findings.json and the full report is accessibility-audit-report.md (an accessible HTML version is alongside it). I also wrote remediation-plan.md, vpat-draft.md, scope.md and a test-kit/ folder. The remediation-plan.md contains unblock steps rather than fixes. vpat-draft.md has every criterion Not Evaluated and must not be published or cited as a conformance claim. The evidence/ and raw/ folders are empty on purpose.
Blockers:
UNREACHABLE: the hostnames don't resolve from here. The fetch tool labels two of the failures ROBOTS_DISALLOWED, but robots.txt was never retrieved, so this isn't a bot block.
AUTH_REQUIRED: I don't have the audit credentials. Please keep it that way and don't paste them into chat.
AT_UNAVAILABLE: this sandbox has no NVDA, JAWS, VoiceOver, TalkBack or devices, so I can't produce transcripts. No one else can be asked to either; this needs human testers.
SOURCE_NOT_PROVIDED: I have no repo or DOM snapshots, so static analysis hasn't run.
THIRD_PARTY_EMBED: the chat widget on /support and the 3DS redirect are out of your direct control, and I couldn't assess whether either is a blocker.
My shell network is also restricted, so rendered scanning from here may fail even with a public URL. The faster route is your team running the kit on staging.
What the kit gives you: a read-only axe script that scans sequentially with at least 500 ms between pages, a token contrast checker, and per-flow screen reader scripts with the payments flow first. I syntax-checked the scripts. I exercised the contrast checker only on synthetic sample data, not your tokens, and I haven't run the axe script because there was nothing to point it at.
Which route do you want?
- Give me a reachable staging URL, or run the kit and send back
axe-results.jsonand the token output. - Give me the React repo (GitHub
owner/repoor zip) or rendered DOM snapshots per page and state, so I can run static analysis. That can prove some failures but nothing about runtime conformance. - Book human AT sessions on the 5-config matrix; I can turn the results into findings, a risk-ordered plan and a real VPAT.
For a launch about a month away, S1/S2 fixes plus a re-test need results within roughly a week. Also ask legal which instrument applies to you; I haven't assessed that. Don't run payment submissions against production.
{
"audit": {
"id": "A11Y-2026-10-08-001",
"target": "https://portal.acmepay-eu.example.com",
"scope": ["/", "/login", "/signup", "/dashboard", "/invoices", "/invoices/:id", "/payments/new", "/payments/:id/receipt", "/settings/profile", "/settings/security", "/support", "/help"],
"conformance_target": "WCAG 2.2 AA",
"jurisdiction": "EU-EN301549",
"status": "BLOCKED",
"blockers": ["UNREACHABLE", "AUTH_REQUIRED", "AT_UNAVAILABLE", "SOURCE_NOT_PROVIDED", "THIRD_PARTY_EMBED"],
"coverage_pct": 0,
"started_at": "2026-10-08T05:31:00Z",
"completed_at": null,
"environment": {
"browsers": [],
"os": [],
"assistive_tech": []
}
},
"summary": {
"total": 0,
"by_severity": { "S1": 0, "S2": 0, "S3": 0, "S4": 0 },
"by_principle": { "perceivable": 0, "operable": 0, "understandable": 0, "robust": 0 },
"verdict": "NOT TESTED",
"note": "Zero findings reflects zero testing, not conformance."
},
"findings": [],
"manual_review_required": [],
"not_tested": [
{ "area": "/ (marketing landing)", "reason": "UNREACHABLE: hostname did not resolve (3 attempts)" },
{ "area": "/login (email, password, SSO)", "reason": "UNREACHABLE" },
{ "area": "/signup (multi-step, KYC, T&C)", "reason": "UNREACHABLE" },
{ "area": "/dashboard (SPA, charts)", "reason": "UNREACHABLE; AUTH_REQUIRED" },
{ "area": "/invoices (virtualized 200+ row table)", "reason": "UNREACHABLE; AUTH_REQUIRED" },
{ "area": "/invoices/:id (detail, PDF download)", "reason": "UNREACHABLE; AUTH_REQUIRED" },
{ "area": "/payments/new (card entry, 3DS redirect)", "reason": "UNREACHABLE; AUTH_REQUIRED; 3DS page is THIRD_PARTY_EMBED (out of direct control)" },
{ "area": "/payments/:id/receipt", "reason": "UNREACHABLE; AUTH_REQUIRED" },
{ "area": "/settings/profile", "reason": "UNREACHABLE; AUTH_REQUIRED" },
{ "area": "/settings/security (2FA, QR code, backup codes)", "reason": "UNREACHABLE; AUTH_REQUIRED" },
{ "area": "/support (third-party chat widget)", "reason": "UNREACHABLE; THIRD_PARTY_EMBED (vendor follow-up required)" },
{ "area": "/help (docs, search)", "reason": "UNREACHABLE" },
{ "area": "Global header/footer templates and ~40 design-system components", "reason": "UNREACHABLE; SOURCE_NOT_PROVIDED" },
{ "area": "Design tokens colour-pair pre-check", "reason": "UNREACHABLE: tokens.json could not be fetched" },
{ "area": "Static source analysis (eslint-plugin-jsx-a11y, grep heuristics)", "reason": "SOURCE_NOT_PROVIDED" },
{ "area": "Automated rendered scans (axe, Lighthouse, Pa11y), both viewports", "reason": "UNREACHABLE; raw/ intentionally empty, no tool was run" },
{ "area": "Keyboard-only traversal, all flows", "reason": "UNREACHABLE" },
{ "area": "Visual/perceptual (contrast, 200% zoom, 400% reflow, text spacing, motion, forced colors)", "reason": "UNREACHABLE" },
{ "area": "NVDA 2024.4 + Chrome 131 / Windows 11 (P0)", "reason": "AT_UNAVAILABLE" },
{ "area": "JAWS 2025 + Chrome 131 / Windows 11 (P0)", "reason": "AT_UNAVAILABLE" },
{ "area": "VoiceOver + Safari 18 / macOS 14 (P0)", "reason": "AT_UNAVAILABLE" },
{ "area": "VoiceOver + Safari 18 / iOS 17, iPhone 15 (P1)", "reason": "AT_UNAVAILABLE" },
{ "area": "TalkBack + Chrome / Android 14, Pixel 8 (P1)", "reason": "AT_UNAVAILABLE" }
]
}
Accessibility Audit Report — AcmePay EU Customer Portal
Audit ID: A11Y-2026-10-08-001
Target: https://portal.acmepay-eu.example.com
Conformance target: WCAG 2.2 AA (+ EN 301 549 v3.2.1)
Audit date: 2026-10-08 (blocked at input validation)
Verdict: NOT TESTED
Coverage: 0% — see §7
1. Executive Summary
This audit could not be performed. The portal and the design-tokens file did not resolve from the audit environment (DNS failure; three attempts with backoff), so no page was loaded, scanned or tested. No credentials were available for the authenticated areas, no screen reader or test device exists in this environment, and no source repository was supplied. Nothing was run and nothing is reported as a result.
Can you ship? This audit cannot answer that. Zero findings here means zero testing. It is not evidence of conformance, and it is not evidence of failure. For a legally binding EU launch, conformance would have to be established by real testing before the launch decision. The requester also states that the payments flow has user-reported screen reader problems and has never been formally tested; that is context from the requester, not an observation of this audit.
| Metric | Value |
|---|---|
| Findings | 0 (nothing tested) |
| S1 / S2 / S3 / S4 | 0 / 0 / 0 / 0 |
| Pages audited | 0 of 12 |
| AT configurations run | 0 of 5 |
| Estimated remediation | Cannot be estimated |
| Legal risk | Unassessed. Legal should confirm the applicable instrument(s); this is not legal advice. |
2. Scope & Methodology
Scope is the 12 pages listed in scope.md, against WCAG 2.2 AA with the EN 301 549 v3.2.1 overlay. The intended method is the four-layer approach (automated scan, manual structural inspection, keyboard testing, screen reader testing). None of the layers executed. Details of what was attempted and the blocker labels are in scope.md.
3. Conformance by Principle
Not evaluated.
4. Top Risks
No findings exist. The following are the highest-priority
untested areas, ordered by the stakes the requester described. They are not findings.
/payments/newand/payments/:id/receipt: payment flow (sensitive flow; user-reported SR problems; 3DS step is third-party)./login,/signup,/settings/security: authentication and KYC flows (SC 3.3.7, 3.3.8; 2FA/QR alternatives).- Global templates and the
/invoicesvirtualized table: a single defect here has site-wide or high-volume reach.
5. Findings
None. No test was run.
6. Remediation Roadmap
No remediation items exist. See remediation-plan.md for the steps needed to unblock the audit, and test-kit/ for scripts your team can run now.
7. Not Tested / Limitations
Everything. Coverage is 0%. The full list, with per-item reasons, is in findings.json under not_tested:
- All 12 pages and all global templates/components.
- Design token colour pairs (tokens.json unreachable).
- Static source analysis (no repo supplied).
- Automated rendered scans on both viewports (nothing run;
raw/is empty by design). - Keyboard-only traversal and visual/perceptual checks.
- NVDA, JAWS, VoiceOver (macOS), VoiceOver (iOS), TalkBack.
- Third-party chat widget (
/support) and 3DS redirect: out of direct control, blocker status unknown.
Environment limitation: this sandbox's shell network is allowlist-limited, so live rendered scanning here may be refused even for a resolvable public URL. Real screen reader testing needs a human tester on real software/devices in any case.
8. Systemic Recommendations
- Run
test-kit/inside your own network or CI against staging and return the output; findings can then be normalized intofindings.json. - Commission real AT sessions using
test-kit/at-test-scripts.md; the payments flow first. - Never run payment submission steps against production with real instruments; use staging or provider test mode.
- After results exist: add axe-core as a merge gate and contrast checks in the token pipeline.
9. Appendix
- A. SC pass/fail matrix: all
Not Evaluated(seevpat-draft.md). - B. Test environment: none established.
- C. Raw tool outputs: none (
raw/empty). - D. Note: the audit skill's SC matrix is abbreviated and omits 3.2.3 Consistent Navigation, 3.2.4 Consistent Identification and, for EN 301 549 v3.2.1, 4.1.1 Parsing (clause 9.4.1.1). These are included in the VPAT draft and test kit.
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Accessibility Audit Report — AcmePay EU Customer Portal</title>
<style>
:root {
--bg: #ffffff;
--fg: #1b1b1b;
--muted: #4a4a4a;
--link: #0a4bc4;
--border: #6b6b6b;
--panel: #f3f4f6;
--alert-bg: #fff4e5;
--alert-border: #8a4b00;
}
@media (prefers-color-scheme: dark) {
:root {
--bg: #121212;
--fg: #f2f2f2;
--muted: #c9c9c9;
--link: #8fb8ff;
--border: #9a9a9a;
--panel: #1e1e1e;
--alert-bg: #2b1d08;
--alert-border: #ffb14d;
}
}
- { box-sizing: border-box; }
html { font-size: 100%; }
body {
margin: 0;
background: var(--bg);
color: var(--fg);
font-family: system-ui, -apple-system, "Segoe UI", Roboto, Arial, sans-serif;
line-height: 1.6;
}
.skip-link {
position: absolute; left: -9999px; top: 0; z-index: 1000;
background: var(--bg); color: var(--link);
padding: .75rem 1rem; border: 2px solid var(--link);
}
.skip-link:focus { left: 0; }
header, main, footer { max-width: 60rem; margin: 0 auto; padding: 1rem; }
h1 { font-size: 1.75rem; line-height: 1.25; margin: 1rem 0 .5rem; }
h2 { font-size: 1.35rem; margin: 2rem 0 .5rem; border-bottom: 1px solid var(--border); padding-bottom: .25rem; }
h3 { font-size: 1.1rem; margin: 1.25rem 0 .25rem; }
a { color: var(--link); text-underline-offset: .15em; }
a:focus-visible, :focus-visible { outline: 3px solid var(--link); outline-offset: 2px; }
@media (forced-colors: active) { :focus-visible { outline: 3px solid Highlight; } }
dl.meta { display: grid; grid-template-columns: max-content 1fr; gap: .25rem 1rem; margin: 0; }
dl.meta dt { font-weight: 700; }
dl.meta dd { margin: 0; }
.verdict {
border: 3px solid var(--alert-border);
background: var(--alert-bg);
padding: .75rem 1rem;
margin: 1rem 0;
}
.verdict strong { font-size: 1.15rem; }
table { border-collapse: collapse; width: 100%; margin: .75rem 0 1rem; }
caption { text-align: left; font-weight: 700; padding: .25rem 0; }
th, td { border: 1px solid var(--border); padding: .5rem .6rem; text-align: left; vertical-align: top; overflow-wrap: anywhere; }
thead th { background: var(--panel); }
code { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: .95em; overflow-wrap: anywhere; }
nav ul { padding-left: 1.25rem; }
@media (max-width: 40rem) {
dl.meta { grid-template-columns: 1fr; }
th, td { padding: .4rem; }
}
@media print {
.skip-link { display: none; }
body { background: #fff; color: #000; }
a { color: #000; }
h2 { break-after: avoid; }
table, .verdict { break-inside: avoid; }
}
</style>
</head>
<body>
<a class="skip-link" href="#main">Skip to main content</a>
<header>
<h1>Accessibility Audit Report — AcmePay EU Customer Portal</h1>
<dl class="meta">
<dt>Audit ID</dt><dd>A11Y-2026-10-08-001</dd>
<dt>Target</dt><dd>https://portal.acmepay-eu.example.com</dd>
<dt>Conformance target</dt><dd>WCAG 2.2 AA (plus EN 301 549 v3.2.1)</dd>
<dt>Audit date</dt><dd>2026-10-08 (blocked at input validation)</dd>
<dt>Coverage</dt><dd>0% (see <a href="#limitations">Not tested and limitations</a>)</dd>
</dl>
<div class="verdict" role="note" aria-label="Verdict">
<strong>Verdict: NOT TESTED.</strong>
No page was loaded or tested. Zero findings reflects zero testing, not conformance.
</div>
<nav aria-label="Report sections">
<ul>
<li><a href="#summary">1. Executive summary</a></li>
<li><a href="#scope">2. Scope and method</a></li>
<li><a href="#blockers">3. Blockers</a></li>
<li><a href="#risks">4. Highest-priority untested areas</a></li>
<li><a href="#findings">5. Findings</a></li>
<li><a href="#roadmap">6. Roadmap to unblock</a></li>
<li><a href="#limitations">7. Not tested and limitations</a></li>
<li><a href="#recommendations">8. Recommendations</a></li>
</ul>
</nav>
</header>
<main id="main" tabindex="-1">
<section aria-labelledby="summary">
<h2 id="summary">1. Executive summary</h2>
<p>This audit could not be performed. The portal and the design-tokens file did not resolve from the audit environment (DNS failure; three attempts with backoff), so no page was loaded, scanned or tested. No credentials were available for the authenticated areas, no screen reader or test device exists in this environment, and no source repository was supplied. Nothing was run and nothing is reported as a result.</p>
<p><strong>Can you ship? This audit cannot answer that.</strong> For a legally binding EU launch, conformance would have to be established by real testing before the launch decision. The requester states that the payments flow has user-reported screen reader problems and has never been formally tested; that is context from the requester, not an observation of this audit.</p>
<table>
<caption>Summary metrics</caption>
<thead><tr><th scope="col">Metric</th><th scope="col">Value</th></tr></thead>
<tbody>
<tr><th scope="row">Findings</th><td>0 (nothing tested)</td></tr>
<tr><th scope="row">S1 / S2 / S3 / S4</th><td>0 / 0 / 0 / 0</td></tr>
<tr><th scope="row">Pages audited</th><td>0 of 12</td></tr>
<tr><th scope="row">Assistive-technology configurations run</th><td>0 of 5</td></tr>
<tr><th scope="row">Estimated remediation</th><td>Cannot be estimated</td></tr>
<tr><th scope="row">Legal risk</th><td>Unassessed. Legal should confirm the applicable instrument(s); this is not legal advice.</td></tr>
</tbody>
</table>
</section>
<section aria-labelledby="scope">
<h2 id="scope">2. Scope and method</h2>
<p>Scope is 12 pages against WCAG 2.2 AA with the EN 301 549 v3.2.1 overlay: <code>/</code>, <code>/login</code>, <code>/signup</code>, <code>/dashboard</code>, <code>/invoices</code>, <code>/invoices/:id</code>, <code>/payments/new</code>, <code>/payments/:id/receipt</code>, <code>/settings/profile</code>, <code>/settings/security</code>, <code>/support</code>, <code>/help</code>. The intended method is four layers: automated scan, manual structural inspection, keyboard testing, and screen reader testing. None of the layers executed.</p>
</section>
<section aria-labelledby="blockers">
<h2 id="blockers">3. Blockers</h2>
<table>
<caption>Blocking conditions and their effect</caption>
<thead><tr><th scope="col">Label</th><th scope="col">Evidence</th><th scope="col">Effect</th></tr></thead>
<tbody>
<tr><th scope="row"><code>UNREACHABLE</code></th><td>Portal and tokens.json each failed 3 attempts (backoff 3 s, then 6 s). First error: name or service not known (DNS). Later attempts: robots.txt could not be fetched, consistent with the same DNS failure (not independently confirmed). No bot denial was observed, so this is not <code>BOT_BLOCKED</code>.</td><td>No live page loaded; token pairs not checked.</td></tr>
<tr><th scope="row"><code>AUTH_REQUIRED</code></th><td>No credentials in this session. Seven account pages are presumed to need login (inferred from route names, not observed).</td><td>Authenticated areas not tested.</td></tr>
<tr><th scope="row"><code>AT_UNAVAILABLE</code></th><td>Linux sandbox; no NVDA, JAWS, VoiceOver or TalkBack; no iPhone or Pixel.</td><td>All five AT configurations not tested; no transcripts exist and none were fabricated.</td></tr>
<tr><th scope="row"><code>SOURCE_NOT_PROVIDED</code></th><td>No repository, zip or DOM snapshots supplied.</td><td>Static analysis not run.</td></tr>
<tr><th scope="row"><code>THIRD_PARTY_EMBED</code></th><td>Chat widget on <code>/support</code>; 3DS redirect on <code>/payments/new</code>.</td><td>Out of direct control; blocker status unknown.</td></tr>
</tbody>
</table>
</section>
<section aria-labelledby="risks">
<h2 id="risks">4. Highest-priority untested areas</h2>
<p>No findings exist. These areas are ordered by the stakes the requester described. They are not findings.</p>
<ol>
<li><code>/payments/new</code> and <code>/payments/:id/receipt</code>: payment flow (sensitive; user-reported screen reader problems; 3DS step is third-party).</li>
<li><code>/login</code>, <code>/signup</code>, <code>/settings/security</code>: authentication and KYC (SC 3.3.7, 3.3.8; 2FA and QR alternatives).</li>
<li>Global templates and the <code>/invoices</code> virtualized table: a single defect has site-wide or high-volume reach.</li>
</ol>
</section>
<section aria-labelledby="findings">
<h2 id="findings">5. Findings</h2>
<p>None. No test was run. See <code>findings.json</code> (canonical).</p>
</section>
<section aria-labelledby="roadmap">
<h2 id="roadmap">6. Roadmap to unblock</h2>
<table>
<caption>Actions needed before an audit can produce results</caption>
<thead><tr><th scope="col">#</th><th scope="col">Action</th><th scope="col">Suggested owner</th><th scope="col">Effort</th></tr></thead>
<tbody>
<tr><th scope="row">1</th><td>Provide a URL reachable from where testing runs (public staging, or run the test kit inside your network).</td><td>Platform / DevOps</td><td>XS</td></tr>
<tr><th scope="row">2</th><td>Run the rate-limited axe script from <code>test-kit/</code> on staging with a pre-authenticated session; return the results file.</td><td>Frontend QA</td><td>S</td></tr>
<tr><th scope="row">3</th><td>Run the token contrast script on tokens.json; return the output.</td><td>Design System</td><td>XS</td></tr>
<tr><th scope="row">4</th><td>Provide the React repository, or rendered DOM snapshots per page and state.</td><td>Frontend lead</td><td>XS–S</td></tr>
<tr><th scope="row">5</th><td>Schedule human screen reader sessions on the five-configuration matrix; payments first.</td><td>QA / external testers</td><td>L</td></tr>
<tr><th scope="row">6</th><td>Obtain vendor accessibility conformance reports for the chat widget and the 3DS provider.</td><td>Procurement</td><td>S</td></tr>
<tr><th scope="row">7</th><td>Set up a read-only test account and sandbox payments; hand credentials over through your vault, never in chat or files.</td><td>Security / Payments eng</td><td>S</td></tr>
</tbody>
</table>
<p>Planning note, not a finding: severity SLAs are S1 within 5 days and S2 within 15 days, and fixes need a re-test. With launch about a month away, results are needed in roughly the next week.</p>
</section>
<section aria-labelledby="limitations">
<h2 id="limitations">7. Not tested and limitations</h2>
<p>Everything. Coverage is 0%. The itemized list with reasons is in <code>findings.json</code> under <code>not_tested</code>.</p>
<ul>
<li>All 12 pages and all global templates and components.</li>
<li>Design token colour pairs.</li>
<li>Static source analysis.</li>
<li>Automated rendered scans on both viewports (the <code>raw/</code> folder is empty by design).</li>
<li>Keyboard traversal and visual or perceptual checks.</li>
<li>NVDA, JAWS, VoiceOver (macOS), VoiceOver (iOS), TalkBack.</li>
<li>Third-party chat widget and 3DS redirect.</li>
</ul>
<p>Environment limitation: this sandbox's shell network is allowlist-limited, so live rendered scanning here may be refused even for a resolvable public URL. Real screen reader testing needs a human tester on real software and devices in any case.</p>
</section>
<section aria-labelledby="recommendations">
<h2 id="recommendations">8. Recommendations</h2>
<ul>
<li>Run the test kit in your own network or CI against staging and return the output.</li>
<li>Commission real assistive-technology sessions, ideally including screen reader users; start with payments.</li>
<li>Never run payment submission steps against production with real instruments; use staging or provider test mode.</li>
<li>After results exist, add axe-core as a merge gate and contrast checks in the token pipeline.</li>
</ul>
</section>
</main>
<footer>
<p>Related files: <code>scope.md</code>, <code>findings.json</code>, <code>accessibility-audit-report.md</code>, <code>remediation-plan.md</code>, <code>vpat-draft.md</code>, <code>test-kit/</code>.</p>
</footer>
</body>
</html>
Remediation Plan — AcmePay EU Customer Portal
Audit ID: A11Y-2026-10-08-001
Status
No findings exist. Nothing was tested. This plan therefore contains no code remediation and no risk scores; inventing them would be fabrication.
A. Actions to unblock the audit (not findings)
Ordered by what gates the most work first. Owners are suggestions; effort uses the audit scale (XS ≤1h, S ≤1d, M ≤3d).
| # | Action | Unblocks | Suggested owner | Effort |
|---|---|---|---|---|
| 1 | Provide a URL reachable from where testing will run (public staging, or run the test kit inside your network/VPN). The current hostnames do not resolve from the audit environment. | UNREACHABLE | Platform / DevOps | XS |
| 2 | Run test-kit/scripts/axe-scan.mjs on staging with a pre-authenticated session state (see test-kit/README.md), and return axe-results.json. | Automated layer, authenticated pages | Frontend QA | S |
| 3 | Download tokens.json and run test-kit/scripts/token-contrast.mjs; return the output. | Token colour pre-check | Design System | XS |
| 4 | Provide the React repo (GitHub owner/repo or zip) so static analysis can run, or return rendered DOM snapshots per page and per state (modal open, error shown, etc.). | SOURCE_NOT_PROVIDED; component-level defects | Frontend lead | XS–S |
| 5 | Schedule human AT sessions on the 5-config matrix using test-kit/at-test-scripts.md. Start with payments (/payments/new → 3DS → receipt) on NVDA and VoiceOver. | AT_UNAVAILABLE | QA / external a11y testers (ideally including screen reader users) | L |
| 6 | Obtain a vendor accessibility conformance report (ACR/VPAT) for the chat widget and ask for their remediation roadmap; do the same for the 3DS provider. | THIRD_PARTY_EMBED | Procurement / Vendor mgmt | S |
| 7 | Create a read-only test account and a staging/sandbox payment setup with provider test cards. Hand credentials over via your vault to the testers; do not paste them into chat or files. | AUTH_REQUIRED; safe payment testing | Security / Payments eng | S |
B. Test priority once unblocked
Based on the stakes you described (sensitive flows escalate one severity tier per the audit model):
- Payments:
/payments/new→ 3DS →/payments/:id/receipt - Authentication/onboarding:
/login,/signup,/settings/security - Global header/footer and design-system overlays (modals, toasts, menus); reach multiplier is highest here
/invoices(virtualized table),/dashboard(charts)/settings/profile,/support,/help,/
C. Schedule note
Planning guidance, not a finding: the severity SLAs are S1 ≤5 days and S2 ≤15 days, and fixes need a re-test. If launch is about a month away, results are needed in roughly the next week to fix S1/S2 items and re-verify before launch.
D. Per-finding remediation entries
None. Add them here (ordered by risk_score desc, then effort asc) after real results exist.
Accessibility Conformance Report — DRAFT (VPAT® 2.5 INT format)
DRAFT. NOT FOR DISTRIBUTION OR PUBLICATION. This document contains
no evaluation results. No page of the product was tested (see Blockers). Every criterion is Not Evaluated. Do not submit, publish, or cite this as a conformance claim. It is a pre-filled structure to be completed after real testing.
Product information
| Field | Value |
|---|---|
| Name of product | AcmePay EU Customer Portal |
| Version | Unknown (not provided) |
| URL | https://portal.acmepay-eu.example.com (did not resolve from the audit environment) |
| Report date | 2026-10-08 (draft; blocked) |
| Contact | To be completed by AcmePay |
| Evaluation methods used | None. No automated, manual, keyboard or assistive-technology evaluation was performed. |
| Applicable standards | WCAG 2.2 Level A and AA (target); EN 301 549 v3.2.1 (its web clause 9 is based on WCAG 2.1 A/AA); Section 508 tables omitted (not requested; add if a US filing is needed) |
| Assistive technology planned | NVDA 2024.4, JAWS 2025, VoiceOver (macOS 14, iOS 17), TalkBack (Android 14). None executed. |
| Third-party components | Chat widget on /support; 3DS redirect on /payments/new. Out of direct control. |
Terms
- Supports / Partially Supports / Does Not Support / Not Applicable: not used in this draft.
- Not Evaluated: the criterion has not been evaluated. This is the only value used here.
Rule for completion: every value other than Supports must cite findings by ID (e.g. F-012) from findings.json.
Table 1: WCAG 2.2 Report — Level A
| Criteria | Conformance level | Remarks and explanations |
|---|---|---|
| 1.1.1 Non-text Content | Not Evaluated | Not tested (UNREACHABLE) |
| 1.2.1 Audio-only and Video-only (Prerecorded) | Not Evaluated | Not tested; applicability unknown |
| 1.2.2 Captions (Prerecorded) | Not Evaluated | Not tested; applicability unknown |
| 1.2.3 Audio Description or Media Alternative (Prerecorded) | Not Evaluated | Not tested; applicability unknown |
| 1.3.1 Info and Relationships | Not Evaluated | Not tested |
| 1.3.2 Meaningful Sequence | Not Evaluated | Not tested |
| 1.3.3 Sensory Characteristics | Not Evaluated | Not tested |
| 1.4.1 Use of Color | Not Evaluated | Not tested |
| 1.4.2 Audio Control | Not Evaluated | Not tested |
| 2.1.1 Keyboard | Not Evaluated | Not tested |
| 2.1.2 No Keyboard Trap | Not Evaluated | Not tested |
| 2.1.4 Character Key Shortcuts | Not Evaluated | Not tested |
| 2.2.1 Timing Adjustable | Not Evaluated | Not tested (note: login/payment session timeouts to be checked) |
| 2.2.2 Pause, Stop, Hide | Not Evaluated | Not tested |
| 2.3.1 Three Flashes or Below Threshold | Not Evaluated | Not tested |
| 2.4.1 Bypass Blocks | Not Evaluated | Not tested |
| 2.4.2 Page Titled | Not Evaluated | Not tested (SPA route titles to be checked) |
| 2.4.3 Focus Order | Not Evaluated | Not tested |
| 2.4.4 Link Purpose (In Context) | Not Evaluated | Not tested |
| 2.5.1 Pointer Gestures | Not Evaluated | Not tested |
| 2.5.2 Pointer Cancellation | Not Evaluated | Not tested |
| 2.5.3 Label in Name | Not Evaluated | Not tested |
| 2.5.4 Motion Actuation | Not Evaluated | Not tested |
| 3.1.1 Language of Page | Not Evaluated | Not tested |
| 3.2.1 On Focus | Not Evaluated | Not tested |
| 3.2.2 On Input | Not Evaluated | Not tested |
| 3.2.6 Consistent Help | Not Evaluated | Not tested (WCAG 2.2 only; not in EN 301 549 v3.2.1) |
| 3.3.1 Error Identification | Not Evaluated | Not tested |
| 3.3.2 Labels or Instructions | Not Evaluated | Not tested |
| 3.3.7 Redundant Entry | Not Evaluated | Not tested (WCAG 2.2 only; multi-step signup/KYC) |
| 4.1.2 Name, Role, Value | Not Evaluated | Not tested |
Table 2: WCAG 2.2 Report — Level AA
| Criteria | Conformance level | Remarks and explanations |
|---|---|---|
| 1.2.4 Captions (Live) | Not Evaluated | Not tested; applicability unknown |
| 1.2.5 Audio Description (Prerecorded) | Not Evaluated | Not tested; applicability unknown |
| 1.3.4 Orientation | Not Evaluated | Not tested |
| 1.3.5 Identify Input Purpose | Not Evaluated | Not tested (autocomplete on card, identity, 2FA fields) |
| 1.4.3 Contrast (Minimum) | Not Evaluated | Not tested; token pairs not checked (tokens.json unreachable) |
| 1.4.4 Resize Text | Not Evaluated | Not tested |
| 1.4.5 Images of Text | Not Evaluated | Not tested |
| 1.4.10 Reflow | Not Evaluated | Not tested |
| 1.4.11 Non-text Contrast | Not Evaluated | Not tested (charts, form borders, focus rings) |
| 1.4.12 Text Spacing | Not Evaluated | Not tested |
| 1.4.13 Content on Hover or Focus | Not Evaluated | Not tested |
| 2.4.5 Multiple Ways | Not Evaluated | Not tested |
| 2.4.6 Headings and Labels | Not Evaluated | Not tested |
| 2.4.7 Focus Visible | Not Evaluated | Not tested |
| 2.4.11 Focus Not Obscured (Minimum) | Not Evaluated | Not tested (WCAG 2.2 only; sticky header) |
| 2.5.7 Dragging Movements | Not Evaluated | Not tested (WCAG 2.2 only) |
| 2.5.8 Target Size (Minimum) | Not Evaluated | Not tested (WCAG 2.2 only) |
| 3.1.2 Language of Parts | Not Evaluated | Not tested |
| 3.2.3 Consistent Navigation | Not Evaluated | Not tested |
| 3.2.4 Consistent Identification | Not Evaluated | Not tested |
| 3.3.3 Error Suggestion | Not Evaluated | Not tested |
| 3.3.4 Error Prevention (Legal, Financial, Data) | Not Evaluated | Not tested (directly relevant to payments) |
| 3.3.8 Accessible Authentication (Minimum) | Not Evaluated | Not tested (WCAG 2.2 only; login, 2FA, CAPTCHA if any) |
| 4.1.3 Status Messages | Not Evaluated | Not tested |
Table 3: WCAG 2.2 Report — Level AAA
Out of the stated conformance target (AA). All Level AAA criteria are Not Evaluated: 1.2.6–1.2.9, 1.3.6, 1.4.6–1.4.9, 2.1.3, 2.2.3–2.2.6, 2.3.2–2.3.3, 2.4.8–2.4.10, 2.4.12–2.4.13, 2.5.5–2.5.6, 3.1.3–3.1.6, 3.2.5, 3.3.5–3.3.6, 3.3.9.
Table 4: EN 301 549 v3.2.1 — Clause 9 (Web)
Clause 9 criteria map one-to-one to WCAG 2.1 Level A and AA success criteria, numbered 9. + the SC number (for example SC 1.1.1 is 9.1.1.1; SC 4.1.2 is 9.4.1.2). Results for each follow Tables 1 and 2 above, so all are Not Evaluated, with these specifics:
| Clause | Conformance level | Remarks and explanations |
|---|---|---|
| 9.1.1.1 – 9.4.1.3 (WCAG 2.1 A/AA equivalents) | Not Evaluated | See Tables 1 and 2. SCs new in WCAG 2.2 (2.4.11, 2.5.7, 2.5.8, 3.2.6, 3.3.7, 3.3.8) are not part of EN 301 549 v3.2.1 but are in your WCAG 2.2 target. |
| 9.4.1.1 Parsing | Not Evaluated | Not tested. Present in EN 301 549 v3.2.1 even though WCAG 2.2 removed SC 4.1.1; legal should confirm how it is to be reported. |
| 9.6 WCAG conformance requirements | Not Evaluated | Full pages, complete processes, accessibility-supported use of technologies, non-interference: not assessed. The payment flow is a complete process (including the third-party 3DS step). |
Table 5: EN 301 549 v3.2.1 — Other clauses
| Clause | Conformance level | Remarks and explanations |
|---|---|---|
| Clause 5 Generic requirements | Not Evaluated | Applicability for a web portal to be determined with legal/product. |
| Clause 11 Software | Not Evaluated | Believed not applicable to a web-only portal; not confirmed. |
| Clause 12 Documentation and support services | Not Evaluated | Help docs (/help), support channels (/support) and any accessibility statement not reviewed. |
Legal notes (not legal advice)
- Legal should confirm which instrument(s) apply to AcmePay's EU services and how EN 301 549 conformance is to be evidenced.
- A public accessibility statement or ACR must only be issued from real evaluation results.
Completion checklist
- Real evaluation run (see
test-kit/). - Every non-
Supportsvalue cites finding IDs. - Third-party components (chat widget, 3DS) reported separately with vendor ACRs.
- Legal review before any external use.
Audit Scope — AcmePay EU Customer Portal
Audit ID: A11Y-2026-10-08-001
Status: BLOCKED — UNREACHABLE (plus AUTH_REQUIRED, AT_UNAVAILABLE, SOURCE_NOT_PROVIDED; see Blockers)
Date opened: 2026-10-08
Target: https://portal.acmepay-eu.example.com
Conformance target: WCAG 2.2 Level AA
Jurisdiction overlay: EU-EN301549 (v3.2.1), stated as legally binding (payment provider)
Time-box: 4 hours (started 2026-10-08 11:01 IST). Budget not exhausted; work stopped because nothing could be tested.
Mode: Read-only on target. Writes only to ./a11y-audit-eu-launch/
Rate limit: concurrency 2 max, >=500 ms delay between requests (requests made: 6 fetches total, see log)
Verdict: NOT TESTED
Coverage: 0%
In-scope pages (12)
/marketing landing/loginemail + password + SSO/signupmulti-step: identity, KYC, T&C/dashboardSPA, heavy charts/invoicesdata table, 200+ rows, virtualized/invoices/:iddetail + PDF download/payments/newcard entry, 3DS redirect/payments/:id/receipt/settings/profileform-heavy/settings/security2FA setup, QR code, backup codes/supportembedded third-party chat widget/helpdocs, searchable
Global templates / components
Header, footer (global); ~40 design-system components (internal). Not inspected.
Third-party (OUT OF DIRECT CONTROL)
- Chat widget on
/support(vendor). Blocker impact unassessed; vendor follow-up required. - 3DS redirect on
/payments/new(issuer/ACS page, not controlled by AcmePay).
Requested assistive-tech matrix (none executed)
- NVDA 2024.4 + Chrome 131 / Windows 11 (P0)
- JAWS 2025 + Chrome 131 / Windows 11 (P0)
- VoiceOver + Safari 18 / macOS 14 (P0)
- VoiceOver + Safari 18 / iOS 17, iPhone 15 (P1)
- TalkBack + Chrome / Android 14, Pixel 8 (P1)
Known context (as stated by the requester; not verified by this audit)
- React 18 SPA, client-side routing.
- Screen reader users report problems in the payments flow; never formally tested.
- Design tokens: https://design.acmepay-eu.example.com/tokens.json (colour-pair pre-check requested).
- Credentials: held in 1Password vault "A11Y-Audit-2025". NOT provided to this session. Never persisted. Do not paste them into chat.
Blockers
| Label | Evidence | Effect |
|---|---|---|
UNREACHABLE | Portal and tokens.json each failed 3 attempts (backoff 3 s, then 6 s). Attempt 1 error: Name or service not known (DNS). Attempts 2–3: robots.txt could not be fetched/parsed, consistent with the same DNS failure (cause not independently confirmed). The fetch tool labels these ROBOTS_DISALLOWED, but robots.txt was never retrieved, so no bot denial was observed; not classed BOT_BLOCKED. | No live page was loaded. Token pairs not pre-checked. |
AUTH_REQUIRED | No credentials in this session. Pages presumed to need login (inferred from route names, not observed): /dashboard, /invoices, /invoices/:id, /payments/new, /payments/:id/receipt, /settings/profile, /settings/security. | Authenticated areas NOT TESTED even if DNS were fixed. |
AT_UNAVAILABLE | Workspace is a Linux sandbox with no NVDA, JAWS, VoiceOver or TalkBack, and no iPhone/Pixel hardware. | All five AT configurations NOT TESTED. No transcripts exist; none fabricated. |
SOURCE_NOT_PROVIDED | No repo (owner/repo), zip, or DOM snapshots supplied. | Static analysis (eslint-plugin-jsx-a11y, grep heuristics) not run. |
THIRD_PARTY_EMBED | Chat widget (/support), 3DS redirect (/payments/new). | Reported as OUT OF DIRECT CONTROL; blocker status unknown. |
Note: this sandbox's shell network is allowlist-limited (package registries, GitHub). Even with a resolvable public URL, rendered scanning here may be refused. The practical route is running test-kit/ inside your own network/CI and returning the output (see test-kit/README.md).
Out of scope
- Anything requiring writes/modification of production (including submitting real payments).
- Load/fuzz/intrusive testing.
Status Log
- 2026-10-08 11:01 IST: Scaffold written.
- 2026-10-08: Reachability check, attempts 1–3 on portal and tokens.json: all failed (see Blockers). Status set to BLOCKED / UNREACHABLE.
- 2026-10-08: No scans, no AT sessions, no findings. Unblock options and a ready-to-run test kit written to
test-kit/.
Connects securely to your tools. The creator never sees your data.
About this skill
Accessibility Audit Skill for Claude Code — WCAG 2.2 AA
Stop shipping accessibility regressions. This production-grade SKILL.md turns Claude into a disciplined WCAG 2.2 Level AA auditor that produces the same artifacts a real consultancy delivers — findings.json, an executive report, remediation patches, a VPAT draft, and a CI gate — from a URL, a repo, or a DOM snapshot.
What it does
- Automated scanning (axe-core, Lighthouse, Pa11y, IBM Equal Access) with manual adjudication of every "incomplete" result — because automation only finds ~35% of real issues
- Manual keyboard traversal per the ARIA Authoring Practices Guide, plus screen-reader testing scripts for NVDA, JAWS, VoiceOver, and TalkBack
- Severity scoring (S1–S4) with a risk formula, SLA per tier, and one-tier escalation for auth, checkout, health, and government flows
- Framework-aware source analysis (React, Vue, Svelte, CSS Modules) with copy-pasteable remediation patches, not just descriptions
- VPAT 2.5 INT / Section 508 / EN 301 549 drafts with honest "Not Evaluated" values where evidence is missing
- GitHub Actions + Playwright CI gate that blocks merges on new S1/S2 issues
- 13 audit artifacts written to ./a11y-audit-<date>/ — always, even when the target is unreachable
Who it's for
- Frontend and platform teams shipping to EU, US, UK, CA, or AU markets
- Design-system maintainers who need component-level acceptance criteria
- QA and compliance leads who need Section 508 ACRs, VPATs, or accessibility statements
- Agencies auditing client sites under EN 301 549 or ADA Title II/III
- Anyone who's been handed a "make it accessible" ticket and doesn't know where to start
Why this skill and not a prompt
Most "a11y prompts" hallucinate findings, claim conformance from a single axe run, and return a chat message with no artifacts. This skill enforces four non-negotiable rules that prevent exactly that:
- Scaffold first, chat second — the audit trail is written before any analysis, so you always get files even on a blocked run
- Cite the error path — every block is labeled with a documented status (UNREACHABLE, SOURCE_NOT_PROVIDED, AT_UNAVAILABLE, etc.), never improvised
- Never fabricate evidence — no invented screen-reader transcripts, no fake tool output, no manufactured findings
- Never over-claim — verdicts are conforms / partially conforms / does not conform / NOT TESTED, and nothing stronger than the evidence supports
Coverage
- WCAG 2.2 Level A + AA (49 success criteria mapped to test methods)
- WAI-ARIA 1.2 and the ARIA Authoring Practices Guide
- EN 301 549 v3.2.1, Section 508 (36 CFR 1194), ADA Title II/III, AODA, UK PSBAR, Australian DTA
- ISO 40500 and ISO 30071-1
Included in every run
scope.md · findings.json · accessibility-audit-report.md (and accessible HTML version) · remediation-plan.md · vpat-draft.md · evidence/ · raw/ · plus test-kit scripts your team can run on staging immediately
Compatibility
Claude Code · Claude.ai Skills · Agent SDK
What's not included
- It does not replace human assistive-technology testing. When no screen reader is available, it writes test scripts for your team and marks criteria "Not Tested" — it never fakes results.
- It is read-only on targets. It will not modify production systems.
How to use
Skills on Agensi run inside your AI agent. Copy the prompt, paste it into your agent, and it connects to Agensi and installs this skill for you. If a payment is needed, your agent shows it to you first.
Reviews
No reviews yet
Be one of the first to try it. Every listed skill passes our trust checks below.
Security scanned
Passed our 8-point scan before listing
Fresh listing
Recently published to Agensi
Money-back guarantee
Doesn't do what its page promises? You get your money back.
Trust & safety
Security scanned
Verified clean 12 days ago
- Passed all security checks, Safe to install
Requires