Skip to content
mobile-foundation

Slash command

/a11y-sweep

Audit mobile accessibility by running the checks this stack has and naming what source cannot decide. Emits no score and no conformance verdict.

The prompt

What it actually sends

A skill is a prompt template, not code. This is the whole of it — expanded fresh on every call, with $ARGUMENTS and $1..$9 filled in from what you type.

Audit the accessibility of $ARGUMENTS in $CWD — a screen, a module, or the whole tree when nothing is named.

$SKILL_DIR/checks.md carries the per-stack commands, the search patterns and the thresholds. Read it before you start and use the checks for the stack you actually detect, rather than the ones you remember.

The line this command will not cross

Source can decide absence. Source cannot decide adequacy.

Reading the tree settles is anything there at all — a control with no label, a hardcoded size that will not scale, an undersized touch target, an image with no alternative text. Find all of those.

Reading the tree cannot settle whether a person can use this app with a screen reader. Focus order is a property of the rendered accessibility tree. Whether a label means anything — "Button" against "Add AeroPress to basket" — is a judgment about a running screen. Contrast is rendered pixels across themes and states. Announcement quality, live regions and gesture alternatives are all runtime facts.

So this command emits no score, no percentage, and no conformance verdict. Those outputs confuse "the scanner found nothing" with "a person can use it", and they get carried into a compliance conversation where they cannot be defended. If asked for one, say why there isn't one.

Do the runnable half first

Every mobile stack has a real automated audit, and most repositories have none of it configured. Run the one that fits — Flutter's meetsGuideline tests, Espresso's AccessibilityChecks, XCUITest's performAccessibilityAudit, the React Native a11y ESLint plugin — and paste each command with its real exit code.

Where the repository has none configured, that is the headline finding. Write NO DYNAMIC AUDIT and print the test file that would add one. Do not fall back to the static sweep and present the result as an audit.

Check the deployment target before promising an audit: performAccessibilityAudit needs iOS 17, and below it the honest answer is that no automated dynamic audit exists for that half of the app.

Then sweep source

Use the patterns in $SKILL_DIR/checks.md, and paste every search you ran so the reader can judge your recall rather than trusting it.

Report each finding as: path:line, then what a person using a screen reader or a 200% font size actually experiences, then the smallest change that fixes it — described, never applied. Rank by that experience, not by rule id. One mislabelled primary action outranks forty decorative icons missing a null label, and a rule-id ranking buries it.

An accessibility opt-out — importantForAccessibility="no", accessibilityElementsHidden, excludeSemantics — may be entirely correct. Report it with the question "is there a reason next to this", not as a violation.

End with two blocks

CHECKED — what you ran, with commands and exit codes, and what the sweep covered, with counts.

NOT ESTABLISHED — every accessibility property this run did not decide, each with the device or manual check that would decide it. Focus order, label meaningfulness, contrast in the themes that ship, and gesture alternatives belong here unless you ran something that genuinely decided them.

This block is the most valuable thing the command produces and it is never empty. A run that emits an empty one has a bug, not a perfect app.

Reference files it reads

Shipped beside the prompt and reachable from it as $SKILL_DIR.

  • checks.md

Part of mobile-foundation. Install it with arcturn add sitharaj88/arcturn/kits/mobile-foundation, then type /a11y-sweep in a session.