accessibility-checks

accessibility-checks is a skill for Claude Code from jhlee0409/omni-harness-kit. It costs 179 tokens per session (2,914 once invoked), scanned A, original, MIT.

A real-browser accessibility audit for WCAG 2.2 AA, a widely used standard for making websites usable by people with disabilities. It measures the rendered page rather than relying on source code alone.

In plain words
What is it for?
Use it after changing a web page to check landmarks and headings, keyboard focus, labels, contrast, target sizes, responsive behaviour, and other accessibility requirements.
Why use it?
It finds runtime problems such as hidden labels, insufficient colour contrast, incorrect structure, or touch targets that are too small.

Skill for Claude Code

Written for Claude Code: shipped in a Claude Code plugin.

Part of the harness-kit plugin — 18 skills, 28 agents, 2 hooks shipped together

Good fit Use it after changing a web page to check landmarks and headings, keyboard focus, labels, contrast, target sizes, responsive behaviour, and other accessibility requirements.

Compare 6 skills from other repositories ↓
Install with agentmods
npx agentmods add skills/jhlee0409/omni-harness-kit/accessibility-checks
Install

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.

Any agent
npx skills add jhlee0409/omni-harness-kit --skill accessibility-checks
Clone the repo
git clone --depth 1 https://github.com/jhlee0409/omni-harness-kit

Made for: Claude Code.

Or install harness-kit, the plugin that ships this one along with the rest of its 18 skills, 28 agents, 2 hooks.

Wrote 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.

agentmods badge for accessibility-checks

README.md
[![agentmods](https://agentmods.dev/badge/skills/jhlee0409/omni-harness-kit/accessibility-checks/github.svg)](https://agentmods.dev/skills/jhlee0409/omni-harness-kit/accessibility-checks)
Your own site
<a href="https://agentmods.dev/skills/jhlee0409/omni-harness-kit/accessibility-checks"><img src="https://agentmods.dev/badge/skills/jhlee0409/omni-harness-kit/accessibility-checks/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.

agentmods 80×15 button for accessibility-checks

Your own site · 80×15
<a href="https://agentmods.dev/skills/jhlee0409/omni-harness-kit/accessibility-checks"><img src="https://agentmods.dev/badge/skills/jhlee0409/omni-harness-kit/accessibility-checks.svg" alt="Reviewed on agentmods" width="80" height="20"></a>
Per session 179 Skills are progressive disclosure: only the name and description are preloaded; the body loads when the skill is used.
When invoked 2,914 The whole file, excluding the scripts and references it only reads on demand.
Security scan A 0 findings. A grade says what 26 rules found in the file — not that it is safe.
Origin original No closer match found in the catalogue.
Token cost

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.

ModelPer sessionOnce invoked
Fable 5.1 $0.00179 $0.02914
Opus 5 $0.00089 $0.01457
Sonnet 5 $0.00036 $0.00583
Haiku 4.5 $0.00018 $0.00291

Measured 10d ago against content hash 03418005a7e1, method: parsed. Prices are Anthropic first-party input rates as of 2026-09-10, from the pricing page.

Security

Grade A, and why

accessibility-checks 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.

adapters/omp/skills/accessibility-checks/SKILL.md · 129 lines

How it starts

The opening of the file, as written. The whole thing — 129 lines — stays where its author put it; the contents beside it link to each section on GitHub.

Accessibility checks — WCAG 2.2 AA, measured in a real browser

Accessibility is a MEASURED property of the rendered DOM, never a source-reading guess. aria-label in JSX proves nothing if the runtime node is display:none, the contrast ratio is 3.9:1, or the tap target renders at 32px. This skill runs the audit against the LIVE page with omp's native browser tool and cites the number for every verdict. "looks accessible" is BANNED — every row carries a measured value or it is CANT-VERIFY.

Setup

  1. git diff --name-only → identify the changed route/component. Read its DESIGN.md (tokens/tone) if present.
  2. Start the dev server on its own port; wait for a stable anchor before probing (a cold compile is not "down").
  3. browser action open the changed route. Then drive every check with action run + tab.evaluate.
  4. All snippets below run inside tab.evaluate(() => { ... }) and RETURN a JSON value — that returned value is the evidence you cite.

1. Semantic structure — landmarks + heading order (WCAG 1.3.1, 2.4.6)

tab.evaluate(() => {
  const landmarks = [...document.querySelectorAll('header,nav,main,aside,footer,[role="banner"],[role="navigation"],[role="main"],[role="contentinfo"]')].map(e => e.tagName+ (e.getAttribute('role')?`[${e.getAttribute('role')}]`:''));
  const headings = [...document.querySelectorAll('h1,h2,h3,h4,h5,h6')].map(h => ({ lvl:+h.tagName[1], text:h.textContent.trim().slice(0,40) }));
  return { mainCount: document.querySelectorAll('main,[role=main]').length, landmarks, headings };
})

FAIL if: mainCount !== 1; no h1; heading levels skip (h2→h4). Cite the actual level sequence.

2. Keyboard nav + focus order + visible focus ring (WCAG 2.1.1, 2.4.3, 2.4.7)

  • Enumerate the tab order and confirm it follows DOM/visual order (no positive tabindex reordering surprises):
tab.evaluate(() => [...document.querySelectorAll('a[href],button,input,select,textarea,[tabindex]')]
  .filter(e => !e.disabled && e.offsetParent !== null)
  .map(e => ({ tag:e.tagName, ti:e.tabIndex, label:(e.textContent||e.value||e.ariaLabel||'').trim().slice(0,30) })))

FAIL if any positive tabIndex > 0 (manual reorder trap), or a control is reachable by mouse but absent from this list.

  • Visible focus ring — focus each interactive node and read :focus-visible computed style; a ring is only real if outline-width/box-shadow actually changes on focus:
tab.evaluate(() => {
  const el = document.querySelector('button');           // repeat per control class
  el.focus();
  const s = getComputedStyle(el);
  return { outlineWidth:s.outlineWidth, outlineStyle:s.outlineStyle, boxShadow:s.boxShadow };
})

FAIL if focused control shows outline-style:none AND no distinguishing box-shadow (invisible focus). outline:0 with no replacement = FAIL.

Read the full file on GitHub · 129 lines

Changes

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.

  1. 10d ago First seen · 129 lines · 179 tokens per session scan A 03418005a7e1

Subscribe to this mod's changes

accessibility-checks is a skill published in the GitHub repository jhlee0409/omni-harness-kit (2 stars, last pushed 1mo ago), licensed MIT. It adds 179 tokens to every session and 2,914 once invoked, about $0.0009 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.

Related

Other skills, from other repositories

journey-simulation

Use when caller wants to observe how a stranger encounters a flow, artifact, or sandbox — triggers like "simulate a user journey", "test our onboarding / checkout / signup", "will my ICP convert", "how does a cold reader experience this README", "first-time user test", "cognitive walkthrough", or any request to…

RockyHong/super-bootstrap · 79 tokens

screen-reader-testing

Test web applications with screen readers including VoiceOver, NVDA, and JAWS. Use when validating screen reader compatibility, debugging accessibility issues, or ensuring assistive technology support.

wshobson/agents · 39 tokens

live-preview

Mid-build visual verification loop. Takes screenshots of components during construction, not just after. Catches visual regressions and invisible features before they compound. Requires Playwright or similar screenshot tool.

SethGammon/Citadel · 40 tokens

test-implement

Implements React/TypeScript unit, integration, and browser E2E tests with the repository's configured runner, mocks, setup, and browser harness. Use when creating or completing frontend tests and generated test skeletons.

shinpr/claude-code-workflows · 48 tokens

symfony:e2e-panther-playwright

Write end-to-end tests with Symfony Panther 2.4 for browser automation or Playwright for complex scenarios.

dev-toolings/superpowers-symfony · 31 tokens

symfony:functional-tests

Write functional tests for Symfony controllers and HTTP endpoints using WebTestCase, getContainer, loginUser, and DAMA rollback.

dev-toolings/superpowers-symfony · 30 tokens