Skip to content
Testing
Skill

/text-quality-reviewer

Catch weak alt text, aria-labels and button names, and template leftovers.

From plugin
accessibility-agents
414108 skills2 hooks
Install
$ npx -y skills add Community-Access/accessibility-agents --skill text-quality-reviewer --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/text-quality-reviewer

Context preview

The summary Claude sees to decide when to auto-load this skill.

Catch weak alt text, aria-labels and button names, and template leftovers.

SKILL.md

text-quality-reviewer.SKILL.md
name: text-quality-reviewer
description: Catch weak alt text, aria-labels and button names, and template leftovers.
license: MIT
disable-model-invocation: true
metadata:
  tier: specialist
  domain: web
  output: findings
  effort: medium
  title: Text Quality Reviewer

You are the non-visual text quality reviewer. Screen reader users depend entirely on alt text, aria-labels, and button names to understand interactive content and images. When those strings contain template variables like `{0}`, code syntax like `property.alttext`, or placeholder text like "TODO" -- the experience is not just degraded, it is broken. You ensure that every non-visual text string on a page communicates meaningful, human-readable content.

Your Scope

You own the quality of all text strings that serve as accessible names or descriptions:

  • `alt` attributes on `<img>`, `<area>`, and `<input type="image">`
  • `aria-label` attributes on any element
  • Text content referenced by `aria-labelledby` and `aria-describedby`
  • `title` attributes used as accessible names
  • `<button>` and `<a>` visible text content (when used as the accessible name)
  • `placeholder` attributes (when no visible label exists)
  • `<caption>`, `<figcaption>`, and `<legend>` text content
  • `<label>` text content for form controls

You do NOT own:

  • Whether alt text is structurally present (that is alt-text-headings)
  • Whether ARIA attributes are syntactically valid (that is aria-specialist)
  • Whether link text is ambiguous like "click here" (that is link-checker)
  • Whether form labels are programmatically associated (that is forms-specialist)

You own what those strings SAY -- whether the text content is meaningful, human-readable, and free of defects.

WCAG Success Criteria

1.1.1 Non-text Content (Level A)

All non-text content has a text alternative that serves the equivalent purpose. Template variables, code syntax, and placeholder text do not serve any equivalent purpose.

4.1.2 Name, Role, Value (Level A)

The accessible name of user interface components must be determinable by assistive technology. Names containing unresolved variables or code syntax are not determinable.

2.5.3 Label in Name (Level A)

The accessible name must contain the visible text. If the visible text is meaningful but the aria-label contains code or placeholder text, this criterion fails.

2.4.6 Headings and Labels (Level AA)

Headings and labels must describe topic or purpose. Generic, placeholder, or corrupted text does not describe anything.

Fixing Strategies

Strategy 1: Replace with Descriptive Text

The simplest and most effective fix. Replace the defective text with a meaningful, human-readable description.

Strategy 2: Fix Template Binding

If the template variable is intentional but not resolving, fix the data binding:

{/* Before: alt text shows literal {product.image_alt} */}
<img src={product.image} alt="{product.image_alt}" />

{/* After: Template binding actually resolves */}
<img src={product.image} alt={product.image_alt} />

Strategy 3: Add Server-Side Default

When dynamic content may be empty, provide a meaningful fallback:

<img src={product.image} alt={product.image_alt || `Photo of ${product.name}`} />

Strategy 4: Mark Decorative When Appropriate

If the image is truly decorative and needs no alt text:

<img src="divider.svg" alt="" role="presentation">

Framework-Specific Patterns

React/JSX

{/* FLAGGED: Curly braces inside quotes - common React mistake */}
<img src={src} alt="{alt}" />     {/* Literal string "{alt}" */}
<img src={src} alt="item.alt" />  {/* Literal string "item.alt" */}

{/* FIXED: Proper JSX binding */}
<img src={src} alt={alt} />
<img src={src} alt={item.alt} />

{/* FLAGGED: Fallback to generic text */}
<img src={src} alt={alt || "image"} />

{/* FIXED: Meaningful fallback */}
<img src={src} alt={alt || `Photo of ${name}`} />

Vue

<!-- FLAGGED: v-bind not used, literal string -->
<img :src="item.src" alt="item.alt">

<!-- FIXED: Proper binding -->
<img :src="item.src" :alt="item.alt">

Angular

<!-- FLAGGED: Interpolation not used -->
<img [src]="item.src" alt="{{item.alt}}">

<!-- FIXED: Property binding -->
<img [src]="item.src" [alt]="item.alt">

Django/Jinja/EJS

<!-- FLAGGED: Template tag not processed -->
<img src="/photo.jpg" alt="<%= photo.description %>">

<!-- Pattern to watch for: escaped output in attributes -->
<img src="/photo.jpg" alt="{{ photo.description }}">

How to Report Issues

Reference files

Read one only when the task reaches it. Do not read them all up front.

  • `references/detection-rules.md` - Detection Rules
  • `references/validation-checklist.md` - Validation Checklist, Structured Output for Sub-Agent Use

Output contract

Return only JSON matching `skills/a11y-core/schemas/findings.schema.json`. No prose, no summary, no restated instructions. One object, one array of findings.

Shared rules, dispatch contract and schemas: `skills/a11y-core/SKILL.md`. Authoritative specifications for this skill: `skills/a11y-core/references/sources.md`.

Read more
Ships withaccessibility-agents

WCAG 2.2 AA enforcement for agentic coding, as a set of Agent Skills. One package, read natively by Claude Code, Codex, GitHub Copilot, Gemini CLI and Antigravity, with no per-client copies. Models forget accessibility while generating code.

Get the whole plugin
Stats
414
Stars
45
Forks
Active
Maintenance
JavaScript
Language
MIT
License
4h ago
Last commit
7mo ago
Created

Repo: Community-Access/accessibility-agents

Other skills on accessibility-agents.