Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx skills add medy-gribkov/arcana --skill accessibility-wcaggit clone --depth 1 https://github.com/medy-gribkov/arcanaWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/medy-gribkov/arcana/accessibility-wcag)<a href="https://agentmods.dev/skills/medy-gribkov/arcana/accessibility-wcag"><img src="https://agentmods.dev/badge/skills/medy-gribkov/arcana/accessibility-wcag/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/medy-gribkov/arcana/accessibility-wcag"><img src="https://agentmods.dev/badge/skills/medy-gribkov/arcana/accessibility-wcag.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00038 | $0.02868 |
| Opus 5 | $0.00019 | $0.01434 |
| Sonnet 5 | $0.00008 | $0.00574 |
| Haiku 4.5 | $0.00004 | $0.00287 |
Grade A, and why
accessibility-wcag scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 10d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 464 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Accessibility & WCAG Compliance
Audit web applications for WCAG 2.1/2.2 compliance, fix accessibility barriers, implement proper semantic HTML and ARIA patterns.
BAD: Common Accessibility Violations
// BAD: Div button without keyboard support
<div className="btn" onClick={handleClick}>
Submit
</div>
// BAD: Color-only error indication
<input className="border-red-500" />
<span style={{color: 'red'}}>Error</span>
// BAD: Image without alt text
<img src="/chart.png" />
// BAD: Aria-label overuse
<button aria-label="Click me">Click me</button>
// BAD: Auto-focus abuse
<input autoFocus />
<Modal open={isOpen}>
<input autoFocus /> {/* Steals focus */}
</Modal>
// BAD: No heading hierarchy
<h1>Page Title</h1>
<h4>Section</h4> {/* Skips h2, h3 */}
// BAD: Form without labels
<input type="text" placeholder="Email" />
<select>
<option>Choose...</option>
</select>
// BAD: Custom dropdown without keyboard support
<div onClick={toggle}>
{options.map(opt => <div onClick={() => select(opt)}>{opt}</div>)}
</div>
GOOD: Accessible Implementations
// GOOD: Semantic button with proper keyboard support
<button type="button" onClick={handleClick}>
Submit
</button>
// GOOD: Multi-sensory error indication
<input
className="border-red-500"
aria-invalid="true"
aria-describedby="email-error"
/>
<span id="email-error" className="text-red-600" role="alert">
<span className="sr-only">Error:</span>
Invalid email format
</span>
// GOOD: Descriptive alt text (or empty for decorative)
<img src="/sales-chart.png" alt="Sales increased 40% in Q4" />
<img src="/decorative-line.svg" alt="" role="presentation" />
// GOOD: Redundant aria-label removed
<button>Click me</button>
// GOOD: Managed focus with trap
function Modal({ open, onClose, children }) {
const modalRef = useRef<HTMLDivElement>(null);
useEffect(() => {
if (!open) return;
const previousFocus = document.activeElement as HTMLElement;
modalRef.current?.focus();
return () => previousFocus?.focus();
}, [open]);
return (
<div
ref={modalRef}
role="dialog"
aria-modal="true"
tabIndex={-1}
onKeyDown={(e) => {
if (e.key === 'Escape') onClose();
}}
>
{children}
</div>
);
}
// GOOD: Proper heading hierarchy
<h1>Page Title</h1>
<h2>Main Section</h2>
<h3>Subsection</h3>
<h2>Another Section</h2>
// GOOD: Labeled form controls
<label htmlFor="email">Email address</label>
<input
id="email"
type="email"
aria-required="true"
aria-describedby="email-hint"
/>
<span id="email-hint" className="text-gray-600">
We'll never share your email
</span>
<label htmlFor="country">Country</label>
<select id="country" aria-required="true">
<option value="">Select a country</option>
<option value="us">United States</option>
</select>
// GOOD: Accessible custom dropdown
function Dropdown({ options, value, onChange, label }) {
const [open, setOpen] = useState(false);
const [activeIndex, setActiveIndex] = useState(0);
const buttonRef = useRef<HTMLButtonElement>(null);
const listRef = useRef<HTMLUListElement>(null);
const handleKeyDown = (e: KeyboardEvent) => {
switch (e.key) {
case 'ArrowDown':
e.preventDefault();
setActiveIndex(prev => Math.min(prev + 1, options.length - 1));
break;
case 'ArrowUp':
e.preventDefault();
setActiveIndex(prev => Math.max(prev - 1, 0));
break;
case 'Enter':
case ' ':
e.preventDefault();
onChange(options[activeIndex]);
setOpen(false);
buttonRef.current?.focus();
break;
case 'Escape':
setOpen(false);
buttonRef.current?.focus();
break;
}
};
return (
<div>
<button
ref={buttonRef}
type="button"
aria-haspopup="listbox"
aria-expanded={open}
aria-labelledby="dropdown-label"
onClick={() => setOpen(!open)}
>
<span id="dropdown-label">{label}</span>: {value}
</button>
{open && (
<ul
ref={listRef}
role="listbox"
aria-labelledby="dropdown-label"
onKeyDown={handleKeyDown}
tabIndex={-1}
>
{options.map((opt, i) => (
<li
key={opt}
role="option"
aria-selected={i === activeIndex}
onClick={() => {
onChange(opt);
setOpen(false);
buttonRef.current?.focus();
}}
>
{opt}
</li>
))}
</ul>
)}
</div>
);
}
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 10d ago First seen · 464 lines · 38 tokens per session scan A 0f675d600ad2
accessibility-wcag is a skill published in the GitHub repository medy-gribkov/arcana (1 stars, last pushed 1mo ago), licensed Apache-2.0. It adds 38 tokens to every session and 2,868 once invoked, about $0.0002 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.
Other skills, from other repositories
layout-discipline
A set of rules for keeping AI-generated web pages visually consistent, including their text sizes, spacing, alignment, cards, and colors.
accessibility-checker
Audit and fix accessibility issues — WCAG 2.2 compliance, ARIA labels, color contrast, keyboard navigation, and screen-reader compatibility.
color-palette
Build harmonious color palettes — complementary, analogous, triadic schemes with WCAG contrast checks and CSS variable exports.
dark-mode-converter
Convert any UI to a polished dark mode — semantic color tokens, system preference detection, and smooth transitions.
frontend-design
Design pixel-perfect frontend UIs with HTML/CSS/Tailwind — responsive layouts, component libraries, and design-to-code workflows.
typography-guide
Select and pair typefaces, set type scales, and generate CSS typography systems for web and print.