audit-accessibility — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited audit-accessibility (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Accessibility is not a finishing touch and not optional. An inaccessible site excludes real people — users who navigate by keyboard, use screen readers, have low vision, or rely on assistive technology. Beyond inclusion, accessibility directly affects SEO, legal compliance, and overall code quality.
This audit reviews every layer of accessibility compliance without requiring external tools. All checks can be performed by reading the code directly.
Every accessibility requirement traces back to one of four principles:
| Level | Description | Action |
|---|---|---|
| Critical | Completely blocks access for a group of users | Fix before any other work |
| High | Significantly impairs access or WCAG AA failure | Fix before launch |
| Medium | Reduces usability for assistive technology users | Fix within current sprint |
| Low | Minor improvement opportunity | Fix when convenient |
Every image must communicate its purpose to users who cannot see it. The rule is not "add alt text to everything" — it is "add the RIGHT alt text based on the image's role."
Rules:
alt="" (empty, not missing)<figcaption> linked via aria-describedby
Color contrast must meet WCAG AA minimums — the most commonly failed accessibility requirement.
| Text Type | Minimum AA | Enhanced AAA |
|---|---|---|
| Normal text (< 18px regular, < 14px bold) | 4.5:1 | 7:1 |
| Large text (≥ 18px regular, ≥ 14px bold) | 3:1 | 4.5:1 |
| UI components and graphics | 3:1 | — |
What to check — review every text color against its background in `variables.css`:
Do not rely on color alone:
Please enter a valid email address
Flag every SVG that carries meaning but has no aria-label and role="img". Flag every decorative SVG that lacks aria-hidden="true".
Every interaction available with a mouse must be available with a keyboard. Tab navigates forward, Shift+Tab backward, Enter activates links and buttons, Space activates buttons, Escape closes modals and dropdowns.
What to check:
Submit
Open
SubmitFlag every: <div> or <span> with onclick but no role="button" and tabindex="0", <a href="javascript:void(0)">, <a> wrapping <button>, custom components without keyboard handlers, visually interactive elements without focusability.
Every interactive element must have a visible focus indicator. Removing the default outline without an alternative is a critical failure.
/* ❌ Critical failure — removes focus visibility */
* { outline: none; }
button:focus { outline: none; }
/* ✅ :focus-visible — shows indicator for keyboard, not mouse */
:focus-visible {
outline: 2px solid var(--border-focus);
outline-offset: 2px;
border-radius: var(--radius-sm);
}Tab order must follow the visual reading flow — left to right, top to bottom.
What to check:
tabindex values greater than 0 — only tabindex="0" and tabindex="-1" should be usedSkip links allow keyboard users to bypass repetitive navigation and jump to main content.
Skip to main content
...
....skip-link {
position: absolute;
top: -100%;
left: var(--space-4);
background-color: var(--bg-elevated);
color: var(--text-primary);
padding: var(--space-3) var(--space-6);
border-radius: var(--radius-md);
text-decoration: none;
z-index: 9999;
transition: top var(--transition-fast);
}
.skip-link:focus {
top: var(--space-4);
}Flag if: no skip link exists, skip link is not first focusable element, target does not exist, skip link never becomes visible on focus.
Users must always be able to navigate away from any component. The only acceptable trap is a modal while open — and Escape must close it.
Full modal focus management code example: see references/interactive-patterns.mdWhat to check:
When prefers-reduced-motion is active, animations must be disabled or significantly reduced.
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
scroll-behavior: auto !important;
}
}Flag if: no prefers-reduced-motion query exists, animations lack the override, scroll behavior not disabled under reduced motion.
The system uses Retrieval Augmented Generation technology.
Home
Solutions
Page title
Features
...
Heading hierarchy — non-negotiable rules:
<h1> per page<h1> → <h2> → <h3>, never <h1> → <h3>
Full name
Email address
*
(required)
Email address
Please enter a valid email address
What to check:
aria-describedbyrole="alert" for automatic announcementFull error handling and form validation code examples: see references/interactive-patterns.mdThe first rule of ARIA: if a native HTML element can do it, use the native element.
Submit
...
Submit
...
Common ARIA patterns:
Home
Menu
...
Sending...
When content updates dynamically, assistive technologies must be notified.
// ✅ Clear aria-live region before updating
function announceToScreenReader(message, urgency = 'polite') {
const announcer = document.getElementById(`${urgency}-announcer`);
announcer.textContent = '';
requestAnimationFrame(() => {
announcer.textContent = message;
});
}Flag if: dynamic content appended without aria-live region, form results not announced, loading states change without AT notification.
Assistive technologies parse HTML directly. Invalid HTML produces unpredictable screen reader behavior.
What to check:
id attributes on any page<a> not wrapping <button>, <li> only inside <ul>/<ol><img> needs alt, <input> needs type<!DOCTYPE html> on every pageEvery interactive element needs all states defined — visually and for assistive technology.
.btn { } /* Default */
.btn:hover { } /* Hover */
.btn:focus-visible { } /* Focus */
.btn:active { } /* Active */
.btn:disabled,
.btn[disabled] { /* Disabled */
opacity: 0.4;
cursor: not-allowed;
pointer-events: none;
}/* Must exist in base.css */
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border: 0;
}Flag if .sr-only is not defined. Flag every place where screen-reader-only context is needed but the class is absent.
Accessibility Audit — [Project Name] Date: [Date] Standard: WCAG 2.1 Level AA Summary
Critical issues: X High priority: X Medium priority: X Low priority: X WCAG principle most affected: [Perceivable / Operable / Understandable / Robust] Overall compliance: [Compliant / Partially compliant / Non-compliant]
Critical Issues [Issue title]
WCAG Principle: [Perceivable / Operable / Understandable / Robust] WCAG Criterion: [e.g., 1.1.1 Non-text Content] File: [filename and line] Issue: [What is wrong and who it affects] Fix: [Specific correction with code example]
High Priority [Same format] Medium Priority [Same format] Low Priority [Same format] Recommended Fix Order
[First because it affects the most users...] [Then...] [Finally...]
Full quick-reference checklist: see references/checklist.md~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.