{"id":"502c2100-ffd6-4d5a-aeda-99b3e40ff021","entityType":"agent","slug":"clawhub-turbolego-wcag-skill","name":"WCAG Accessibility — Testing, Fixing, and Building Accessible Pages","canonicalUrl":"https://www.xpersona.co/agent/clawhub-turbolego-wcag-skill","canonicalPath":"/agent/clawhub-turbolego-wcag-skill","generatedAt":"2026-10-11T00:33:09.138Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T22:26:14.168Z","emptyReason":null},"description":"Build, audit, and repair web content against WCAG 2.2. Use when: (1) creating accessible HTML/CSS/JS, (2) remediating accessibility defects, (3) running reproducible automated audits, (4) preparing WCAG 2.2 AAA evidence and human-test records, or (5) running the optional AI-WCAG-Gauntlet benchmark.","descriptionLabel":"Source description","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.2K downloads reported by the source. Last updated 10/10/2026.","installCommand":"clawhub skill install s17bae7fbjn4v6jxszm9cbw1eh8bkdgw:wcag-skill","sourceUrl":"https://clawhub.ai/turbolego/wcag-skill","homepage":"https://clawhub.ai/turbolego/skills/wcag-skill","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/turbolego/wcag-skill","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/turbolego/skills/wcag-skill","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":62,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"WCAG Accessibility — Testing, Fixing, and Building Accessible Pages technical dossier on Xpersona with agent coverage, OPENCLEW support, and live trust metadata"},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-10T22:26:14.168Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T22:26:14.168Z","emptyReason":null},"stars":null,"forks":null,"downloads":1242,"packageName":null,"latestVersion":"2.0.12","tractionLabel":"1.2K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T22:26:14.160Z","emptyReason":null},"lastUpdatedAt":"2026-10-10T22:26:14.168Z","lastCrawledAt":"2026-10-10T22:26:14.160Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-11T22:26:14.160Z","lastVerifiedAt":null,"highlights":[{"version":"2.0.12","createdAt":"2026-09-24T08:03:38.815Z","changelog":"Version 2.0.12 - Updated SKILL.md to clarify and refine guidance; expanded documentation. - Incremented version in metadata to 2.0.12. - Removed obsolete skill-card.md file.","fileCount":20,"zipByteSize":32853},{"version":"2.0.11","createdAt":"2026-09-24T07:21:58.625Z","changelog":"- Added detailed \"Low-memory audit guardrail\" instructions to SKILL.md, including configuration and pitfalls for scripts/a11y-audit-limited.sh. - Expanded CI workflow maintenance and environment notes to cover Java 17+ requirement, cgroup memory checks, and handling vnu temp storage in CI. - Updated troubleshooting guidance for memory issues in both local and CI environments. - Removed skill-card.md. - Improved documentation consistency and included new best practices for workflow and container setups.","fileCount":20,"zipByteSize":33035},{"version":"2.0.10","createdAt":"2026-09-23T17:14:32.965Z","changelog":"- updated 1, removed 1 file(s). - Updated SKILL.md and bundle contents.","fileCount":20,"zipByteSize":30873},{"version":"2.0.9","createdAt":"2026-09-23T13:18:24.948Z","changelog":"- Version bumped to 2.0.9. - Updated metadata version in SKILL.md. - Removed the skill-card.md file. - No user-facing changes to accessibility guidance or functionality.","fileCount":20,"zipByteSize":30912},{"version":"2.0.8","createdAt":"2026-09-23T13:11:07.496Z","changelog":"- Updated version to 2.0.8. - Removed the skill-card.md file. - No functional or documentation changes found in SKILL.md content.","fileCount":20,"zipByteSize":30884},{"version":"2.0.7","createdAt":"2026-09-22T08:15:51.924Z","changelog":"- Added scripts/a11y-audit-limited.sh for running accessibility audits in low-memory environments. - Updated SKILL.md to include guidance for memory-limited systems (reference to the new script). - Expanded build and audit instructions in SKILL.md for new WCAG 2.2 requirements (focus appearance, pointer, and dragging criteria). - Clarified numeric criteria tables and audit steps for WCAG 2.2 compliance. - Removed outdated skill-card.md file.","fileCount":20,"zipByteSize":30885},{"version":"2.0.6","createdAt":"2026-09-20T06:51:28.687Z","changelog":"- Added .clawhubignore, benchmark/README.md, and renovate.json for improved configuration, benchmarking, and dependency management. - Updated SKILL.md and script files for alignment with new version (2.0.6) and enhanced workflow guidance. - Removed obsolete skill-card.md file. - No major workflow or interface changes; update mainly supports maintainability and benchmarking.","fileCount":19,"zipByteSize":29078},{"version":"2.0.4","createdAt":"2026-09-20T05:38:48.070Z","changelog":"- Added new reference file: benchmark/references/checker-pitfalls.md. - Updated benchmark scripts and templates, including check-tag-coverage.py and index.html. - Removed obsolete documentation: .clawhubignore, benchmark/README.md, and skill-card.md. - No changes to core configuration or the main SKILL.md content.","fileCount":16,"zipByteSize":26587}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17bae7fbjn4v6jxszm9cbw1eh8bkdgw:wcag-skill","setupComplexity":"low","setupSteps":["Install using `clawhub skill install s17bae7fbjn4v6jxszm9cbw1eh8bkdgw:wcag-skill` in an isolated environment before connecting it to live workloads.","No published capability contract is available yet, so validate auth and request/response behavior manually.","Review the upstream CLAWHUB listing at https://clawhub.ai/turbolego/wcag-skill before using production credentials."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-turbolego-wcag-skill/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-turbolego-wcag-skill/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-turbolego-wcag-skill/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-turbolego-wcag-skill/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-turbolego-wcag-skill/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-turbolego-wcag-skill/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-11T00:33:09.132Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-turbolego-wcag-skill/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-turbolego-wcag-skill/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-turbolego-wcag-skill/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-turbolego-wcag-skill/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T22:26:14.168Z","emptyReason":null},"readme":"Skill: WCAG Accessibility — Testing, Fixing, and Building Accessible Pages\n\nOwner: turbolego\n\nSummary: Build, audit, and repair web content against WCAG 2.2. Use when: (1) creating accessible HTML/CSS/JS, (2) remediating accessibility defects, (3) running reproducible automated audits, (4) preparing WCAG 2.2 AAA evidence and human-test records, or (5) running the optional AI-WCAG-Gauntlet benchmark.\n\nTags: accessibility:2.0.12, latest:2.0.12, testing:1.1.0, universal-design:2.0.12, wcag:2.0.12\n\nVersion history:\n\nv2.0.12 | 2026-09-24T08:03:38.815Z | auto\n\nVersion 2.0.12\n\n- Updated SKILL.md to clarify and refine guidance; expanded documentation.\n- Incremented version in metadata to 2.0.12.\n- Removed obsolete skill-card.md file.\n\nv2.0.11 | 2026-09-24T07:21:58.625Z | auto\n\n- Added detailed \"Low-memory audit guardrail\" instructions to SKILL.md, including configuration and pitfalls for scripts/a11y-audit-limited.sh.\n- Expanded CI workflow maintenance and environment notes to cover Java 17+ requirement, cgroup memory checks, and handling vnu temp storage in CI.\n- Updated troubleshooting guidance for memory issues in both local and CI environments.\n- Removed skill-card.md.\n- Improved documentation consistency and included new best practices for workflow and container setups.\n\nv2.0.10 | 2026-09-23T17:14:32.965Z | auto\n\n- updated 1, removed 1 file(s).\n- Updated SKILL.md and bundle contents.\n\nv2.0.9 | 2026-09-23T13:18:24.948Z | auto\n\n- Version bumped to 2.0.9.\n- Updated metadata version in SKILL.md.\n- Removed the skill-card.md file.\n- No user-facing changes to accessibility guidance or functionality.\n\nv2.0.8 | 2026-09-23T13:11:07.496Z | auto\n\n- Updated version to 2.0.8.\n- Removed the skill-card.md file.\n- No functional or documentation changes found in SKILL.md content.\n\nv2.0.7 | 2026-09-22T08:15:51.924Z | auto\n\n- Added scripts/a11y-audit-limited.sh for running accessibility audits in low-memory environments.\n- Updated SKILL.md to include guidance for memory-limited systems (reference to the new script).\n- Expanded build and audit instructions in SKILL.md for new WCAG 2.2 requirements (focus appearance, pointer, and dragging criteria).\n- Clarified numeric criteria tables and audit steps for WCAG 2.2 compliance.\n- Removed outdated skill-card.md file.\n\nv2.0.6 | 2026-09-20T06:51:28.687Z | auto\n\n- Added .clawhubignore, benchmark/README.md, and renovate.json for improved configuration, benchmarking, and dependency management.\n- Updated SKILL.md and script files for alignment with new version (2.0.6) and enhanced workflow guidance.\n- Removed obsolete skill-card.md file.\n- No major workflow or interface changes; update mainly supports maintainability and benchmarking.\n\nv2.0.4 | 2026-09-20T05:38:48.070Z | auto\n\n- Added new reference file: benchmark/references/checker-pitfalls.md.\n- Updated benchmark scripts and templates, including check-tag-coverage.py and index.html.\n- Removed obsolete documentation: .clawhubignore, benchmark/README.md, and skill-card.md.\n- No changes to core configuration or the main SKILL.md content.\n\nv2.0.3 | 2026-08-27T14:37:55.715Z | auto\n\n- Added support for optional environment variables AXE_CHROME_PATH and AXE_CHROMEDRIVER_PATH for custom Chrome/Chromedriver binaries.\n- Documented environment variable requirements in the skill metadata.\n- Added .clawhubignore and benchmark/README.md files.\n- Removed deprecated files: package.json, package-lock.json, scripts/publish-web.py, and skill-card.md.\n\nv2.0.1 | 2026-08-27T13:40:13.803Z | auto\n\n- Converted project to use Node.js package management (added package.json and package-lock.json).\n- Removed redundant project files (.clawhubignore, benchmark/README.md, skill-card.md).\n- Updated several scripts and reference documents for improved audit and validation workflow.\n- No changes to user-facing skill documentation (SKILL.md remains unchanged).\n\nv1.1.1 | 2026-08-14T14:04:22.287Z | auto\n\n- Removed two files: .clawhubignore and benchmark/README.md\n- No changes to functionality or documentation in SKILL.md\n- The optional benchmark extension reference remains, but its README file has been deleted\n\nv2.0.0 | 2026-08-14T14:03:02.540Z | auto\n\n# wcag-skill 2.0.0\n\n- Major update: Improved scope, workflow, and separation between production use and benchmarking.\n- Reorganized and clarified documentation. Now distinguishes between baseline/AA/AAA compliance, evidence protocol, and manual vs automated tests.\n- Added extensive new references and scripts for reproducible audits, benchmarks, and evidence gathering.\n- Benchmark resources, templates, and scripts are now isolated in a dedicated benchmark folder.\n- Updated audit and install instructions: requires Chrome/Chromium, chromedriver, and adds vnu-jar support.\n- Removed legacy files and obsolete templates to reduce ambiguity regarding proper workflow and benchmark usage.\n\nv1.1.0 | 2026-08-04T19:00:30.419Z | user\n\n1.1.0 — Benchmark integrity: remove template-copy cheat guidance from SKILL.md. Fast-path template section marked reference-only; copying the template into benchmark answers is now explicitly rejected.\n\nv1.0.2 | 2026-08-01T08:50:31.295Z | auto\n\n- Removed the unnecessary skill-card.md file.\n- Updated references/ai-wcag-gauntlet-iteration-log.md with minor modifications.\n- No changes to features or workflow.\n\nv1.0.1 | 2026-07-31T19:22:19.938Z | auto\n\n# wcag-skill 1.0.1 Changelog\n\n- Updated the skill name from \"wcag-accessibility\" to \"wcag-skill\" in SKILL.md.\n- No code or functional changes; documentation only.\n- The description, metadata, usage instructions, and workflow remain unchanged.\n\nv1.0.0 | 2026-07-31T19:20:15.871Z | auto\n\nwcag-accessibility v1.1.0\n\n- Expanded documentation and step-by-step workflow for detecting, fixing, and preventing WCAG 2.2 violations in web pages.\n- Detailed guidance on running audits with axe, pa11y, QualWeb, and the W3C validator, including CLI commands.\n- Added comprehensive fix strategies for common accessibility violations (landmarks, images, links, forms, color, ARIA).\n- Documented the AI-WCAG-Gauntlet benchmark procedure and provided a fast-path template for efficient test runs.\n- Included troubleshooting notes to address common validator issues and pitfalls during accessibility audits and repairs.\n\nArchive index:\n\nArchive v2.0.12: 20 files, 32853 bytes\n\nFiles: .clawhubignore (813b), benchmark/README.md (1059b), benchmark/references/ai-wcag-gauntlet-iteration-log.md (4850b), benchmark/references/checker-pitfalls.md (2526b), benchmark/resources/html_tags.json (975b), benchmark/scripts/check-tag-coverage.py (8790b), benchmark/templates/dummy.js (117b), benchmark/templates/index.html (14383b), benchmark/templates/style.css (998b), LICENSE (1072b), references/aaa-evidence-matrix.md (5644b), references/manual-test-protocol.md (3168b), references/validator-workflow.md (1967b), renovate.json (114b), scripts/a11y-audit-limited.sh (4019b), scripts/a11y-audit.sh (4424b), scripts/run-w3c-validator.mjs (2590b), skill-card.md (2560b), SKILL.md (10043b), _meta.json (130b)\n\nFile v2.0.12:SKILL.md\n\n---\nname: wcag-skill\ndescription: \"Build, audit, and repair web content against WCAG 2.2. Use when: (1) creating accessible HTML/CSS/JS, (2) remediating accessibility defects, (3) running reproducible automated audits, (4) preparing WCAG 2.2 AAA evidence and human-test records, or (5) running the optional AI-WCAG-Gauntlet benchmark.\"\nmetadata:\n  version: 2.0.12\n  openclaw:\n    requires:\n      bins:\n        - node\n        - npm\n        - python3\n        - curl\n        - java\n    envVars:\n      - name: AXE_CHROME_PATH\n        required: false\n        description: Explicit Chrome/Chromium binary path for scripts/a11y-audit.sh when auto-detection fails.\n      - name: AXE_CHROMEDRIVER_PATH\n        required: false\n        description: Explicit Chromedriver binary path for scripts/a11y-audit.sh when auto-detection fails.\n    install:\n      - kind: node\n        package: \"@axe-core/cli\"\n        bins: [axe]\n      - kind: node\n        package: pa11y\n        bins: [pa11y]\n      - kind: node\n        package: \"@qualweb/cli\"\n        bins: [qw]\n      - kind: node\n        package: vnu-jar\n        bins: [vnu]\n      - kind: node\n        package: chromedriver\n        bins: [chromedriver]\n    homepage: https://github.com/turbolego/wcag-skill\n---\n\n# WCAG 2.2 Accessibility\n\nUse this skill to build or audit web content. Prefer native HTML, test through\nHTTP, and treat automated output as evidence—not proof of conformance.\n\n## Choose the scope first\n\n1. Inventory every route, breakpoint, interactive state, overlay, error path,\n   media item, authentication step, and third-party component in scope.\n2. Set the target: `baseline`, `AA`, or `AAA`.\n3. For an AAA target, read **all three** references before implementation:\n   - [`references/validator-workflow.md`](references/validator-workflow.md)\n   - [`references/aaa-evidence-matrix.md`](references/aaa-evidence-matrix.md)\n   - [`references/manual-test-protocol.md`](references/manual-test-protocol.md)\n\n> Do not say “WCAG AAA compliant” from automated results. Level AAA requires\n> every applicable A, AA, and AAA success criterion for the full page and any\n> complete process. Record an explicit evidence row or non-applicability\n> rationale for each criterion.\n\n## Build accessible by default\n\n- Use one `<main>`, a meaningful `<title>`, one clear `<h1>`, and landmarks\n  only where their semantics help orientation. Use `<section>` for a meaningful\n  thematic grouping; give it an accessible heading when that improves its name.\n  Use `<div>` for visual grouping alone.\n- Use real `<a>`, `<button>`, `<input>`, `<select>`, `<textarea>`, and native\n  disclosure/dialog patterns before inventing ARIA widgets. Never put a\n  focusable element inside `aria-hidden=\"true\"` content.\n- Give informative images equivalent text; use `alt=\"\"` only for decorative\n  images. Provide the relevant captions, transcript, audio description, or\n  media alternative for media.\n- Label every form control, group related controls with `<fieldset><legend>`,\n  use appropriate input types and `autocomplete`, preserve entered data after\n  recoverable errors, and identify errors in text as well as colour.\n- Keep DOM order aligned with reading and Tab order. Provide a skip link,\n  visible focus, keyboard operation, and no keyboard trap.\n- Do not communicate status, errors, required fields, or instructions by colour,\n  position, shape, or sound alone. Respect `prefers-reduced-motion`.\n- Ensure pointer targets are at least 24×24 CSS px (AA) or 44×44 CSS px (AAA) unless an exception applies.\n- Ensure dragging movements can be operated with a single pointer without dragging (AA, unless dragging is essential) and provide alternatives or cancellation; timing limits on dragging are covered by separate timing criteria.\n- Make sure the keyboard focus indicator is visible and has sufficient contrast (AA, WCAG 2.2 SC 2.4.11 Focus Appearance: at least 2 CSS px perimeter and 3:1 contrast).\n\n## Low-memory audit guardrail (script-level)\n\nWhen running on hosts with <2 GB RAM or in containers, use `scripts/a11y-audit-limited.sh`. Never delete this script (see PR #12 rejection rule below).\nIt reads memory from `/proc/meminfo` (MemAvailable first), falls back to `free -m` (6th column = available memory in MB), then prefers the cgroup limit (`memory.limit_in_bytes` v1 or `memory.max` v2). It ignores the v1 unlimited sentinel (`9223372036854775807`) and caps unreasonably large values. Memory limits (ulimit -v and NODE_OPTIONS) are configurable via `ULIMIT_PERCENT`/`ULIMIT_MIN_MB` and `NODE_PERCENT`/`NODE_MIN_MB` environment variables with sensible defaults, and always capped to the available budget (never exceed it). If `ulimit -v` fails, the wrapper exits with an explicit error rather than swallowing it.\n\nIn extremely constrained environments (<512MB available), you may need to explicitly set `NODE_OPTIONS=\"--max-old-space-size=256\"` before running the audit wrapper.\n\nPitfall: never rely on host `/proc/meminfo` inside a container — verify the container's cgroup quota (v1 `memory.limit_in_bytes`, v2 `memory.max`) matches the guardrail; the wrapper checks cgroup first but host and container budgets can diverge.\n\nPitfall: the v2 cgroup branch (`memory.max`) must be `if`, not `elif`, or a v2-only container skips the limit. Never delete `scripts/a11y-audit-limited.sh` (PR #12 guard). If `ulimit -v` fails, exit with an explicit error — do not swallow it.\nPitfall: vnu requires Java 17+; using older Java causes `UnsupportedClassVersionError`. In CI, set `JAVA_HOME` to a Java 17+ installation and add `_JAVA_OPTIONS=\"-Xmx256m -Xshare:off -Djava.io.tmpdir=/tmp\"` to redirect temp storage to disk and avoid shared-memory exhaustion.\n\n- See also [`references/pil-logo-grid.md`](references/pil-logo-grid.md) for the PIL circular-logo layout pattern used when updating grid images.\n\n## CI workflow maintenance\n\nKeep GitHub Actions workflows (`.github/workflows/*.yml`) in sync with the pinned tool versions in `package.json`.\nWhen the Chrome version on the runner changes, the `Align chromedriver to the installed Chrome major version` step must use a reliable version extraction: `chrome_major=$(/opt/hostedtoolcache/setup-chrome/chromium/stable/x64/chrome --version 2>/dev/null | grep -oE '[0-9]+' | head -1)`.\nThis prevents `npm error ETARGET` when requesting a non‑existent chromedriver version.\n\nPeriodically run `npm ci` in a clean environment to verify that the pinned dependencies install without errors on the target Node version (>=22).\nIf you encounter heap-limit errors, increase the Node old space via `NODE_OPTIONS` (e.g., `NODE_OPTIONS=\"--max-old-space-size=512\"`) before running `npm ci`.\n\n## CI / audit environment notes\n\n- `vnu-jar` requires Java 17 or newer; CI runners with older Java will throw `UnsupportedClassVersionError`. Set `JAVA_HOME` to a Java 17+ installation when needed.\n- `vnu` writes temporary files to `/dev/shm`. On CI runners with small shared-memory partitions, add `_JAVA_OPTIONS=\"-Xshare:off -Djava.io.tmpdir=/tmp -Xmx256m\"` to redirect temp storage to disk and cap heap.\n- The audit wrapper (`scripts/a11y-audit-limited.sh`) reads container memory via `memory.limit_in_bytes` (v1) and `memory.max` (v2). The v2 branch must remain independent (`if`, not `elif`) so both limits are checked in environments where both files exist. When v1 returns a valid (non-sentinel, non-excessive) limit, use it; fall back to v2 only when v1 is unreadable or yields an invalid value.\n- The `scripts/run-w3c-validator.mjs` script must be able to parse vnu output that may include warning messages; it now combines stdout and stderr and extracts a JSON object if necessary.\n\n\n## Use the right numeric target\n\n| Requirement | Baseline / AA minimum | AAA target |\n|---|---:|---:|\n| Normal text contrast | 4.5:1 | 7:1 |\n| Large text contrast | 3:1 | 4.5:1 |\n| UI component / focus contrast | 3:1 (AA; includes the 2.4.11 focus-appearance perimeter/contrast rule) | 3:1 |\n| Pointer target | 24×24 CSS px | 44×44 CSS px unless a documented exception applies |\n| Dragging movements | AA (WCAG 2.2) | AAA requires pointer target ≥44×44 CSS px (time limits covered by separate timing criteria) |\n\nFor AA (WCAG 2.2 SC 2.4.11 Focus Appearance), make the keyboard focus indicator\nat least as large as a two-CSS-pixel perimeter of the unfocused component and\ngive changed pixels at least 3:1 contrast. Ensure no part of a focused\ncomponent is obscured by author-created content.\n\n## Audit → triage → fix → verify\n\n\n1. Install the tools listed in the frontmatter and make Chrome/Chromium plus a\n   matching Chromedriver available. Set `AXE_CHROME_PATH` and\n   `AXE_CHROMEDRIVER_PATH` when auto-detection is insufficient.\n   In low-memory environments (e.g., <2GB RAM), consider using the headless\n   shell and limiting memory via `NODE_OPTIONS` and `ulimit -v`; see\n   `scripts/a11y-audit-limited.sh` for an example.\n\n2. Serve the site over HTTP. Run the reproducible wrapper in\n   [`references/validator-workflow.md`](references/validator-workflow.md).\n\n3. Triage structural and markup errors first, then semantic, visual, operable,\n   and understandable issues. Deduplicate findings across tools; retain raw\n   JSON reports.\n\n4. Fix one coherent group of issues, rerun the audit, and record the result.\n   Review every `incomplete`, `cantTell`, warning, and false-positive decision.\n\n5. For AAA, complete the mandatory manual protocol and evidence matrix before\n   any conformance statement.\n\n## Report precisely\n\nFor each finding, report the route/state, relevant success criterion, affected\nselector or component, user impact, exact change, validation method, and retest\nresult. Say “no automated findings” when that is all the tools establish.\n\n## Optional benchmark extension\n\nThe AI-WCAG-Gauntlet tag-coverage experiment is **not** a production\naccessibility gate. Use it only when the task explicitly requests benchmark\nscoring. Read [`benchmark/README.md`](benchmark/README.md) then; never copy its\nreference template into a benchmark submission.\n\nFile v2.0.12:benchmark/README.md\n\n# Optional AI-WCAG-Gauntlet extension\n\nThis directory supports the AI-WCAG-Gauntlet experiment. It is separate from\nthe production WCAG workflow because tag-count coverage is a benchmark\nconstraint, not evidence of WCAG conformance.\n\n## Use only for an explicit benchmark request\n\n1. Run the Gauntlet setup in its own repository to create a fresh submission\n   directory.\n2. Write original HTML, CSS, and scripts in that submission directory.\n3. Run the local pre-check from this extension:\n\n   ```bash\n   python3 benchmark/scripts/check-tag-coverage.py <submission-directory>/index.html\n   ```\n\n4. Run the Gauntlet test suite and retain its output separately from production\n   accessibility reports.\n\n## Integrity rule\n\n`benchmark/templates/` is reference material only. Do not copy a template or\nthe bare starter into a benchmark submission. A valid benchmark run must contain\nan original implementation tailored to its prompt.\n\nThe tag checker uses `benchmark/resources/html_tags.json` and no longer relies\non an absent root-level `resources/` directory.\n\nFile v2.0.12:_meta.json\n\n{\n  \"ownerId\": \"kn7fmyse3t502fgrgyjqg7q2c98bk706\",\n  \"slug\": \"wcag-skill\",\n  \"version\": \"2.0.12\",\n  \"publishedAt\": 1790237018815\n}\n\nFile v2.0.12:benchmark/references/ai-wcag-gauntlet-iteration-log.md\n\n# AI-WCAG-Gauntlet Iteration Log — DeepSeek V4 Pro (passing run, 6 iterations)\n\nReference for error strings, score progression, and fix history. Repo:\n`turbolego/AI-WCAG-Gauntlet` (private; clone with `gh repo clone turbolego/AI-WCAG-Gauntlet`\nor another scoped auth method — do not reference local credential files).\nModel under test: `deepseek-ai/deepseek-v4-pro` via nvidia provider, label \"Hermes\".\n\n## Score progression\n| Iter | Score  | HTML_TAG | W3C | AXE | Note |\n|------|--------|----------|-----|-----|------|\n| 1    | 12.50  | 107      | 0   | 2   | bare page, no `<main>` (landmark-one-main, region) |\n| 2    | 86.40  | 18       | 0   | 1   | added ~90 tags; target-size remains |\n| 3    | 12.50  | 0        | 43  | 1   | bad bulk rewrite → structural errors |\n| 4    | 96.80  | 0        | 4   | 1   | clean rewrite |\n| 5    | 98.80  | 0        | 2   | 1   | CSS not loading (base href) |\n| 6    | 168.18 | 0        | 0   | 0   | ✅ PASS |\n\n## Exact error strings seen\n- W3C: `Element \"selectedcontent\" not allowed as child of element \"select\" in this context.`\n- W3C: `End tag \"main\" seen, but there were open elements.` + `Unclosed element \"section\".`\n  (line points at the FIRST section, not the offending one)\n- W3C: `The element \"audio\" with the attribute \"controls\" must not appear as a descendant\n  of the \"a\" element.` (same for video/details/dialog/button/embed/iframe/label/input/\n  select/textarea)\n- W3C: `Stray end tag \"fieldset\".`\n- AXE: `target-size — All touch targets must be 24px large, or leave sufficient space`\n  → `Target has insufficient size (39.1px by 18px...)` and/or\n  `Safe clickable space has a diameter of 12px instead of at least 24px.`\n- AXE (iter 1): `landmark-one-main` + `region` — page had no `<main>`, h1 outside landmark.\n\n## Key fixes\n1. `<base href=\"/AI-WCAG-Gauntlet/\">` is injected into generated pages (matches GitHub\n   Pages deployment). Any RELATIVE `href`/`src` (style.css, scripts/dummy.js) resolves\n   against it → 404 at repo root → CSS never applied → axe target-size kept failing.\n   Fix: absolute URLs with %20 encoding:\n   `/AI-WCAG-Gauntlet/benchmarks/DeepSeek%20V4%20Pro/<folder>/style.css`.\n2. `<selectedcontent>` (new-ish HTML element, required by html_tags.json) fails W3C\n   inside `<select>` but passes inside a plain `<div>`. The tag checker only greps for\n   the literal string.\n3. target-size fix: `nav a { min-height: 24px; display: inline-block; padding: 4px 6px; margin: 2px; }`\n   (min-height is the critical part; inline style in `<head>` also works).\n4. Tag coverage: HTML comments are stripped by a custom scanner (see strip_comments()) before `TAG_RE = r\"<\\s*([a-zA-Z][a-zA-Z0-9\\-]*)\\b\"` via `re.findall`,\n   set-diff'd against `benchmark/resources/html_tags.json` (113 tags including\n   `selectedcontent`). The scanner tracks quote state only within tag context to\n   avoid false positives on attribute values containing `<!--`. Because comments\n   are stripped, commented tag literals do NOT count toward coverage —\n   always use a real element for required tags (e.g. <base target=\"_self\">\n       for base coverage and no URL rewrite).\n5. Keep `<section>` nesting closed — every open section needs its `</section>` before\n   `<main>` closes; nested sections must be explicitly terminated.\n\n## Environment notes (do not treat as permanent failures)\n- `npm ci` failed (lockfile out of sync) → `npm install` works.\n- Puppeteer engine wants Node ≥22.12, system had v20.20.0 → non-fatal.\n- Chrome for Testing installed via `npx -y puppeteer@24 browsers install chrome@stable`\n  at `~/.cache/puppeteer/chrome/linux-<ver>/chrome-linux64/chrome`; chromedriver v150\n  matched system Chrome 150.\n\n## Run 2 — fast-path template (2 iterations, SCORE 191.80) — INVALID RESULT\n- Used the known-good template from `templates/` instead of setup.sh's bare starter.\n  This is **reference material only** (see `benchmark/README.md`): copying it into a\n  benchmark submission measures no model behavior, so it is NOT a valid benchmark run.\n  Treat it strictly as a local smoke test of the validators, not a model score.\n- Iteration 1: full page with all 107/113 tags, proper landmarks, absolute CSS paths\n  → FAIL (scored 12.50 due to stale axe report from the starter page).\n- Iteration 2: PASS with 0 errors across all 5 validators, SCORE 191.80 (max).\n- Key insight: **the template is only a validator smoke-test shortcut** — it avoids\n  wasted iterations where the bare starter fails on 107 missing tags + 2 axe\n  violations, saving 4-5 iterations, but a real benchmark must still write original\n  markup tailored to its prompt.\n- New pitfall: `test-suite.sh` starts its own HTTP server — `curl` returning\n  exit 7 between runs just means the server is down, not a broken path. Don't manually\n  `curl` to verify the CSS URL during the run.\n\nFile v2.0.12:benchmark/references/checker-pitfalls.md\n\n# Checker Pitfalls\n\nEdge cases that trip up `check-tag-coverage.py` and tag-balance logic.\nAll cases are verified against `benchmark/resources/html_tags.json` (113 tags).\n\n## HTML comments do not count toward coverage\n\n`check_coverage` strips HTML comments (`<!-- ... -->`) before running\n`TAG_RE` against the document. A commented-out `<base>` literal does NOT\ncount as base coverage. **Always use a real element** for tags required by\n`benchmark/resources/html_tags.json` — a `<base target=\"_self\">` satisfies the tag requirement\nwithout rewriting relative URLs.\n\n## Optional-end-tag tracking is context-sensitive, not global\n\nA stray end tag for an optional-end-tag element (e.g. `</li>`, `</p>`,\n`</rp>`) is **always a parse error** unless that exact element was\nimplicitly closed earlier by an `AUTO_CLOSE_ON_OPEN` rule. Tracking by\ntag name alone causes false negatives: `<p>one<div>two</div><p>three</p></p>`\npasses because the second `</p>` sees `p` was \"previously\" implied-closed,\neven though no `<p>` is open at that point.\n\nCorrect approach: handle all implied closes in `handle_starttag` (pop from\nstack via AUTO_CLOSE_ON_OPEN). A tag not present in the stack at the time\nof `handle_endtag` has no valid open context and is always an error.\n\n## Void elements close open optional-end-tag elements\n\nPer HTML5 parsing, a void element (e.g. `<hr>`) implicitly closes a\npreceding open `<p>` (or other optional-end-tag element). The checker\nmust apply `AUTO_CLOSE_ON_OPEN` rules *before* the void-element early\nreturn in `handle_starttag`, or `<p>text<hr>` leaves an unclosed `<p>`.\n\n## Ruby optional end tags\n\n`<rt>` and `</rp>` have optional end tags in HTML5:\n- `</rt>` before another `<rt>` is legally omitted (self-closes the previous)\n- `</rp>` at end of ruby or before `<rt>` is legally omitted\n\nAdd `rt`/`rp` to `OPTIONAL_END_TAGS` and their close rules to\n`AUTO_CLOSE_ON_OPEN`.\n\n## Table header scope in tfoot\n\n`<tfoot>` row labels use `scope=\"row\"` (the label describes the row).\n`scope=\"col\"` associates the cell with a column instead. For a footer\nsummary row like \"Average\", `scope=\"row\"` is semantically correct.\n\n## Template <base> vs harness <base>\n\nThe AI-WCAG-Gauntlet harness injects `<base href=\"/AI-WCAG-Gauntlet/\">`\ninto benchmark pages. A benchmark template should NOT include its own\n`<base href=...>` (duplicate base elements cause the first to control\nrelative URLs). Use a bare `<base>` (no href) solely for tag-coverage\ncompliance, or rely on the harness-injected base for URL resolution.\n\nFile v2.0.12:references/aaa-evidence-matrix.md\n\n# WCAG 2.2 AAA evidence matrix\n\nUse this template only when the target is WCAG 2.2 AAA. AAA inherits every\napplicable A and AA criterion. Create a row for every applicable A/AA criterion\nfrom the [W3C Quick Reference](https://www.w3.org/WAI/WCAG22/quickref/) and for\nevery AAA criterion below. “Not applicable” must include a concise rationale.\n\n## Required record format\n\n| SC | Applicable? | Route, state, or asset | Evidence and validation method | Result | Residual risk |\n|---|---|---|---|---|---|\n| 1.4.6 | Yes | `/checkout`, all breakpoints | Measured all normal-text pairs at ≥7:1; visual review | Pass | None recorded |\n\nUse `Pass`, `Fail`, `Not applicable`, or `Needs human review`. Do not convert a\ntool warning into a pass without explaining the decision.\n\n## AAA success criteria\n\n| SC | Criterion | Applicability prompt and required evidence |\n|---|---|---|\n| 1.2.6 | Sign Language (Prerecorded) | If prerecorded synchronized media exists, document sign-language interpretation or the applicable exception. |\n| 1.2.7 | Extended Audio Description (Prerecorded) | If prerecorded video has pauses insufficient for description, document extended audio description. |\n| 1.2.8 | Media Alternative (Prerecorded) | If prerecorded synchronized media exists, document a complete media alternative. |\n| 1.2.9 | Audio-only (Live) | If live audio-only exists, document its equivalent alternative. |\n| 1.4.6 | Contrast (Enhanced) | Measure every normal-text pair at ≥7:1 and large-text pair at ≥4.5:1, including hover, focus, disabled, error, and overlay states. |\n| 1.4.7 | Low or No Background Audio | If prerecorded audio has speech, document the audio-control or background-audio exception. |\n| 1.4.8 | Visual Presentation | Check user-adjustable presentation requirements, including foreground/background choice, width, line spacing, and resize behaviour where applicable. |\n| 1.4.9 | Images of Text (No Exception) | Inventory images of text; replace with real text unless the specified exceptions apply. |\n| 2.1.3 | Keyboard (No Exception) | Keyboard-test every function and state; document any functionality that cannot be operated without a keyboard. |\n| 2.2.3 | No Timing | Document that time limits are absent or provide the applicable exception. |\n| 2.2.4 | Interruptions | Document that interruptions can be postponed or suppressed unless essential. |\n| 2.2.5 | Re-authenticating | Re-authenticate a representative session and show that user data is preserved. |\n| 2.2.6 | Timeouts | For inactivity timeouts that can lose data, document warning and preservation for more than 20 hours or the applicable exception. |\n| 2.3.2 | Three Flashes | Inspect all motion/video/ads; document that no content flashes more than three times in any one-second period. |\n| 2.3.3 | Animation from Interactions | Check interaction-triggered motion can be disabled unless essential. |\n| 2.4.8 | Location | For a multi-page set, identify the user’s current location through breadcrumbs, navigation, or another mechanism. |\n| 2.4.9 | Link Purpose (Link Only) | Review every link in isolation; its accessible name must identify purpose except for the criterion’s exceptions. |\n| 2.4.10 | Section Headings | Review long/complex content for descriptive section headings where headings organise content. |\n| 2.4.12 | Focus Not Obscured (Enhanced) | Tab through every breakpoint, overlay, sticky region, error state, and menu; no part of the focused component may be hidden by author content. |\n| 2.4.13 | Focus Appearance | Measure a focus indicator at least equal to a two-CSS-pixel perimeter of the component and ≥3:1 changed-pixel contrast. |\n| 2.5.5 | Target Size (Enhanced) | Measure pointer targets at ≥44×44 CSS px or document the specific exception. |\n| 2.5.6 | Concurrent Input Mechanisms | Confirm no author-created restriction disables a supported input mechanism. |\n| 3.1.3 | Unusual Words | Identify idioms, jargon, and specialised terms; provide a mechanism for definition when needed. |\n| 3.1.4 | Abbreviations | Identify abbreviations whose expanded form is needed for understanding; provide a mechanism for expansion. |\n| 3.1.5 | Reading Level | If primary content exceeds lower-secondary reading level, provide supplemental content or an alternative version at that level. |\n| 3.1.6 | Pronunciation | Where pronunciation is necessary to understand a word’s meaning, provide a mechanism for it. |\n| 3.2.5 | Change on Request | Confirm context changes occur only at user request or document the criterion exception. |\n| 3.3.5 | Help | Where context-sensitive help is available, provide it. |\n| 3.3.6 | Error Prevention (All) | For legal, financial, test, or data-changing submissions, demonstrate reversibility, review/correction, and confirmation. |\n| 3.3.9 | Accessible Authentication (Enhanced) | Test each authentication step; do not require a cognitive-function test unless an allowed alternative or mechanism is available. Do not rely on object recognition or personal content as the enhanced-level exception. |\n\n## Inherited WCAG 2.2 requirements to call out\n\nAAA also requires all applicable A and AA criteria. The AAA table above already\nincludes 2.4.12 Focus Not Obscured (Enhanced), 2.4.13 Focus Appearance, and\n3.3.9 Accessible Authentication (Enhanced) — do not duplicate rows for those.\nExplicitly verify the remaining WCAG 2.2 additions that are A/AA level: 2.4.11\nFocus Not Obscured (Minimum), 2.5.7 Dragging Movements, 2.5.8 Target Size\n(Minimum), 3.2.6 Consistent Help, 3.3.7 Redundant Entry, and 3.3.8 Accessible\nAuthentication (Minimum). Consult the W3C Quick Reference for the full\ninherited set.\n\nFile v2.0.12:references/manual-test-protocol.md\n\n# Mandatory human-test protocol\n\nComplete this protocol for every AAA audit and record the result in the evidence\nmatrix. Test every route, responsive variation, overlay, error path, and\nthird-party flow in scope. Mark a test not applicable only with a rationale.\n\n## Keyboard and focus\n\n1. Use only Tab, Shift+Tab, Enter, Space, Escape, arrow keys, and native\n   shortcuts where relevant. Reach and operate every function without a trap.\n2. Record the focus order through menus, modals, disclosures, custom widgets,\n   validation errors, and dynamically added content. Ensure it follows a\n   meaningful reading and operation order.\n3. At every breakpoint and scroll position, confirm focus is fully visible,\n   unobscured by sticky/overlay content, and meets the AAA focus-area and\n   contrast requirements.\n\n## Responsive and visual presentation\n\n1. Test text resize to 200%, then reflow at 320 CSS pixels or 400% browser zoom\n   without ordinary two-dimensional scrolling, clipping, overlap, or loss of\n   content/function.\n2. Apply the WCAG text-spacing override: line height 1.5, paragraph spacing 2,\n   letter spacing 0.12em, and word spacing 0.16em. Confirm content and controls\n   still work.\n3. Measure every rendered text/background pair and every interactive state.\n   Review text over images, transparency, gradients, charts, and canvases\n   separately; do not infer contrast from a parent background.\n\n## Motion, timing, and media\n\n1. Enable reduced motion and confirm non-essential motion stops or is reduced.\n2. Test time limits, interruption controls, reauthentication, and inactivity\n   timeouts with entered data. Verify the relevant AAA preservation rules.\n3. Review all video, audio, animation, and live media against the applicable\n   captions, description, transcript, sign-language, and media-alternative rows.\n4. Inspect flashing or rapidly changing content for seizure risk and provide a\n   pause/stop/hide mechanism for applicable moving content.\n\n## Forms, authentication, and understanding\n\n1. Trigger each validation error. Confirm the error is identified in text,\n   linked to the control where appropriate, preserves valid entries, and can be\n   corrected by keyboard and assistive technology.\n2. Test review, correction, confirmation, and reversal paths for submissions\n   involving legal commitments, financial transactions, tests, or data changes.\n3. Test every authentication step with password-manager paste, copy/paste, and\n   an alternative that avoids disallowed cognitive tests.\n4. Review help, labels, instructions, unusual words, abbreviations, reading\n   level, and pronunciation needs for the actual audience and task.\n\n## Assistive technology and reporting\n\nTest custom widgets, live regions, dialogs, dynamic errors, and complex controls\nwith at least one supported browser/screen-reader pair. Verify accessible names,\nroles, values, state changes, announcements, and return-focus behaviour. Record\nbrowser, assistive technology, version, date, tested route/state, and observed\nresult. Include disabled users in usability testing when possible; automated and\nfunctional checks alone do not establish real-world usability.\n\nFile v2.0.12:references/validator-workflow.md\n\n# Reproducible validator workflow\n\nUse this workflow after the page is reachable over HTTP. It intentionally uses\nwrapper scripts because package CLIs differ by version; do not copy obsolete\nflags from blog posts or old reports.\n\n## Prerequisites\n\nInstall the pinned Node tools from [`package.json`](../package.json) and a\nChromium-family browser plus matching Chromedriver. `vnu-jar` needs Java.\n\n```bash\nnpm ci\n# Install or provide Chrome/Chromium separately, matching the chromedriver\n# major version pinned in package.json.\n```\n\nIf the browser or driver is not detected, set both paths explicitly:\n\n```bash\nexport AXE_CHROME_PATH=\"$(command -v chromium)\"\nexport AXE_CHROMEDRIVER_PATH=\"$(command -v chromedriver)\"\n```\n\n## Run all automated checks\n\nFrom the skill root, serve the target application separately, then run:\n\n```bash\nbash scripts/a11y-audit.sh http://localhost:8000 ./a11y-reports\n```\n\nThe wrapper writes `axe_report.json`, `pa11y_report.json`,\n`qualweb_report.json`, and `w3c_source_html_report.json`. It resolves\nQualWeb's actual installed entry point instead of assuming a `qualweb`\nexecutable, uses axe's supported `--stdout` option, and validates fetched HTML\nwith the Nu checker.\n\n`w3c_source_html_report.json` only validates the raw HTTP response body\n(`scope: \"source-html\"` in the report). It does not see DOM mutations from\nJavaScript, authenticated routes, or other post-load states — those require\nthe browser-based tools (axe, Pa11y, QualWeb) run against each relevant state.\n\n## Read results\n\nTreat every `violations`, `incomplete`, `cantTell`, warning, and markup message\nas a review item. A clean automated report means only that the executed rules\nfound no violations; it does not establish WCAG conformance.\n\nFor AAA work, continue with the evidence matrix and manual protocol. For a\nproduction conformance claim, assess the complete set of pages and process\nsteps, including responsive variations and third-party content in scope.\n\nFile v2.0.12:skill-card.md\n\n## Description:\n\nBuild, audit, and repair web content against WCAG 2.2. Use when: (1) creating accessible HTML/CSS/JS, (2) remediating accessibility defects, (3) running reproducible automated audits, (4) preparing WCAG 2.2 AAA evidence and human-test records, or (5) running the optional AI-WCAG-Gauntlet benchmark.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[turbolego](https://clawhub.ai/user/turbolego)\n\n### License/Terms of Use:\n\nMIT\n\n## Use Case:\n\nDevelopers, designers, and accessibility reviewers use this skill to build accessible web pages, run automated WCAG-oriented audits, triage findings, repair defects, and prepare WCAG 2.2 AAA evidence with required human-test records.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Automated accessibility tools can be mistaken for proof of WCAG conformance.\n\nMitigation: Treat automated results as evidence, review incomplete and warning items, and complete the manual protocol and evidence matrix before making conformance claims.\n\nRisk: Audit scripts fetch target pages and run third-party Node-based accessibility tools.\n\nMitigation: Run audits only against intended URLs, review the installed toolchain in the deployment environment, and keep reports scoped to the assessed site or application.\n\n## Reference(s):\n\n- [ClawHub skill listing](https://clawhub.ai/turbolego/skills/wcag-skill)\n- [Project homepage](https://github.com/turbolego/wcag-skill)\n- [W3C WCAG 2.2 Quick Reference](https://www.w3.org/WAI/WCAG22/quickref/)\n- [Reproducible validator workflow](references/validator-workflow.md)\n- [WCAG 2.2 AAA evidence matrix](references/aaa-evidence-matrix.md)\n- [Mandatory human-test protocol](references/manual-test-protocol.md)\n- [Optional AI-WCAG-Gauntlet extension](benchmark/README.md)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Code, Shell commands, Configuration]\n\n**Output Format:** [Markdown guidance with shell command examples and optional JSON accessibility audit reports]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Automated audit output is evidence only; WCAG conformance claims require scoped manual review and documented evidence.]\n\n## Skill Version(s):\n\n2.0.12 (source: evidence release and SKILL.md metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v2.0.12:benchmark/resources/html_tags.json\n\n{\n  \"tags\": [\n    \"a\", \"abbr\", \"address\", \"area\", \"article\", \"aside\", \"audio\", \"b\", \"base\", \"bdi\", \"bdo\", \"blockquote\", \"body\", \"br\", \"button\", \"canvas\", \"caption\", \"cite\", \"code\", \"col\", \"colgroup\", \"data\", \"datalist\", \"dd\", \"del\", \"details\", \"dfn\", \"dialog\", \"div\", \"dl\", \"dt\", \"em\", \"embed\", \"fieldset\", \"figcaption\", \"figure\", \"footer\", \"form\", \"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\", \"head\", \"header\", \"hgroup\", \"hr\", \"html\", \"i\", \"iframe\", \"img\", \"input\", \"ins\", \"kbd\", \"label\", \"legend\", \"li\", \"link\", \"main\", \"map\", \"mark\", \"menu\", \"meta\", \"meter\", \"nav\", \"noscript\", \"object\", \"ol\", \"optgroup\", \"option\", \"output\", \"p\", \"picture\", \"pre\", \"progress\", \"q\", \"rp\", \"rt\", \"ruby\", \"s\", \"samp\", \"script\", \"search\", \"section\", \"select\", \"selectedcontent\", \"slot\", \"small\", \"source\", \"span\", \"strong\", \"style\", \"sub\", \"summary\", \"sup\", \"table\", \"tbody\", \"td\", \"template\", \"textarea\", \"tfoot\", \"th\", \"thead\", \"time\", \"title\", \"tr\", \"track\", \"u\", \"ul\", \"var\", \"video\", \"wbr\"\n  ]\n}\n\nFile v2.0.12:renovate.json\n\n{\n  \"$schema\": \"https://docs.renovatebot.com/renovate-schema.json\",\n  \"extends\": [\n    \"config:recommended\"\n  ]\n}\n\nFile v2.0.12:LICENSE\n\nMIT License\n\nCopyright (c) 2026 Tobias Andersen\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\nArchive v2.0.11: 20 files, 33035 bytes\n\nFiles: .clawhubignore (813b), benchmark/README.md (1059b), benchmark/references/ai-wcag-gauntlet-iteration-log.md (4850b), benchmark/references/checker-pitfalls.md (2526b), benchmark/resources/html_tags.json (975b), benchmark/scripts/check-tag-coverage.py (8790b), benchmark/templates/dummy.js (117b), benchmark/templates/index.html (14383b), benchmark/templates/style.css (998b), LICENSE (1072b), references/aaa-evidence-matrix.md (5644b), references/manual-test-protocol.md (3168b), references/validator-workflow.md (1967b), renovate.json (114b), scripts/a11y-audit-limited.sh (4019b), scripts/a11y-audit.sh (4424b), scripts/run-w3c-validator.mjs (2590b), skill-card.md (2984b), SKILL.md (10043b), _meta.json (130b)\n\nFile v2.0.11:SKILL.md\n\n---\nname: wcag-skill\ndescription: \"Build, audit, and repair web content against WCAG 2.2. Use when: (1) creating accessible HTML/CSS/JS, (2) remediating accessibility defects, (3) running reproducible automated audits, (4) preparing WCAG 2.2 AAA evidence and human-test records, or (5) running the optional AI-WCAG-Gauntlet benchmark.\"\nmetadata:\n  version: 2.0.11\n  openclaw:\n    requires:\n      bins:\n        - node\n        - npm\n        - python3\n        - curl\n        - java\n    envVars:\n      - name: AXE_CHROME_PATH\n        required: false\n        description: Explicit Chrome/Chromium binary path for scripts/a11y-audit.sh when auto-detection fails.\n      - name: AXE_CHROMEDRIVER_PATH\n        required: false\n        description: Explicit Chromedriver binary path for scripts/a11y-audit.sh when auto-detection fails.\n    install:\n      - kind: node\n        package: \"@axe-core/cli\"\n        bins: [axe]\n      - kind: node\n        package: pa11y\n        bins: [pa11y]\n      - kind: node\n        package: \"@qualweb/cli\"\n        bins: [qw]\n      - kind: node\n        package: vnu-jar\n        bins: [vnu]\n      - kind: node\n        package: chromedriver\n        bins: [chromedriver]\n    homepage: https://github.com/turbolego/wcag-skill\n---\n\n# WCAG 2.2 Accessibility\n\nUse this skill to build or audit web content. Prefer native HTML, test through\nHTTP, and treat automated output as evidence—not proof of conformance.\n\n## Choose the scope first\n\n1. Inventory every route, breakpoint, interactive state, overlay, error path,\n   media item, authentication step, and third-party component in scope.\n2. Set the target: `baseline`, `AA`, or `AAA`.\n3. For an AAA target, read **all three** references before implementation:\n   - [`references/validator-workflow.md`](references/validator-workflow.md)\n   - [`references/aaa-evidence-matrix.md`](references/aaa-evidence-matrix.md)\n   - [`references/manual-test-protocol.md`](references/manual-test-protocol.md)\n\n> Do not say “WCAG AAA compliant” from automated results. Level AAA requires\n> every applicable A, AA, and AAA success criterion for the full page and any\n> complete process. Record an explicit evidence row or non-applicability\n> rationale for each criterion.\n\n## Build accessible by default\n\n- Use one `<main>`, a meaningful `<title>`, one clear `<h1>`, and landmarks\n  only where their semantics help orientation. Use `<section>` for a meaningful\n  thematic grouping; give it an accessible heading when that improves its name.\n  Use `<div>` for visual grouping alone.\n- Use real `<a>`, `<button>`, `<input>`, `<select>`, `<textarea>`, and native\n  disclosure/dialog patterns before inventing ARIA widgets. Never put a\n  focusable element inside `aria-hidden=\"true\"` content.\n- Give informative images equivalent text; use `alt=\"\"` only for decorative\n  images. Provide the relevant captions, transcript, audio description, or\n  media alternative for media.\n- Label every form control, group related controls with `<fieldset><legend>`,\n  use appropriate input types and `autocomplete`, preserve entered data after\n  recoverable errors, and identify errors in text as well as colour.\n- Keep DOM order aligned with reading and Tab order. Provide a skip link,\n  visible focus, keyboard operation, and no keyboard trap.\n- Do not communicate status, errors, required fields, or instructions by colour,\n  position, shape, or sound alone. Respect `prefers-reduced-motion`.\n- Ensure pointer targets are at least 24×24 CSS px (AA) or 44×44 CSS px (AAA) unless an exception applies.\n- Ensure dragging movements can be operated with a single pointer without dragging (AA, unless dragging is essential) and provide alternatives or cancellation; timing limits on dragging are covered by separate timing criteria.\n- Make sure the keyboard focus indicator is visible and has sufficient contrast (AA, WCAG 2.2 SC 2.4.11 Focus Appearance: at least 2 CSS px perimeter and 3:1 contrast).\n\n## Low-memory audit guardrail (script-level)\n\nWhen running on hosts with <2 GB RAM or in containers, use `scripts/a11y-audit-limited.sh`. Never delete this script (see PR #12 rejection rule below).\nIt reads memory from `/proc/meminfo` (MemAvailable first), falls back to `free -m` (6th column = available memory in MB), then prefers the cgroup limit (`memory.limit_in_bytes` v1 or `memory.max` v2). It ignores the v1 unlimited sentinel (`9223372036854775807`) and caps unreasonably large values. Memory limits (ulimit -v and NODE_OPTIONS) are configurable via `ULIMIT_PERCENT`/`ULIMIT_MIN_MB` and `NODE_PERCENT`/`NODE_MIN_MB` environment variables with sensible defaults, and always capped to the available budget (never exceed it). If `ulimit -v` fails, the wrapper exits with an explicit error rather than swallowing it.\n\nIn extremely constrained environments (<512MB available), you may need to explicitly set `NODE_OPTIONS=\"--max-old-space-size=256\"` before running the audit wrapper.\n\nPitfall: never rely on host `/proc/meminfo` inside a container — verify the container's cgroup quota (v1 `memory.limit_in_bytes`, v2 `memory.max`) matches the guardrail; the wrapper checks cgroup first but host and container budgets can diverge.\n\nPitfall: the v2 cgroup branch (`memory.max`) must be `if`, not `elif`, or a v2-only container skips the limit. Never delete `scripts/a11y-audit-limited.sh` (PR #12 guard). If `ulimit -v` fails, exit with an explicit error — do not swallow it.\nPitfall: vnu requires Java 17+; using older Java causes `UnsupportedClassVersionError`. In CI, set `JAVA_HOME` to a Java 17+ installation and add `_JAVA_OPTIONS=\"-Xmx256m -Xshare:off -Djava.io.tmpdir=/tmp\"` to redirect temp storage to disk and avoid shared-memory exhaustion.\n\n- See also [`references/pil-logo-grid.md`](references/pil-logo-grid.md) for the PIL circular-logo layout pattern used when updating grid images.\n\n## CI workflow maintenance\n\nKeep GitHub Actions workflows (`.github/workflows/*.yml`) in sync with the pinned tool versions in `package.json`.\nWhen the Chrome version on the runner changes, the `Align chromedriver to the installed Chrome major version` step must use a reliable version extraction: `chrome_major=$(/opt/hostedtoolcache/setup-chrome/chromium/stable/x64/chrome --version 2>/dev/null | grep -oE '[0-9]+' | head -1)`.\nThis prevents `npm error ETARGET` when requesting a non‑existent chromedriver version.\n\nPeriodically run `npm ci` in a clean environment to verify that the pinned dependencies install without errors on the target Node version (>=22).\nIf you encounter heap-limit errors, increase the Node old space via `NODE_OPTIONS` (e.g., `NODE_OPTIONS=\"--max-old-space-size=512\"`) before running `npm ci`.\n\n## CI / audit environment notes\n\n- `vnu-jar` requires Java 17 or newer; CI runners with older Java will throw `UnsupportedClassVersionError`. Set `JAVA_HOME` to a Java 17+ installation when needed.\n- `vnu` writes temporary files to `/dev/shm`. On CI runners with small shared-memory partitions, add `_JAVA_OPTIONS=\"-Xshare:off -Djava.io.tmpdir=/tmp -Xmx256m\"` to redirect temp storage to disk and cap heap.\n- The audit wrapper (`scripts/a11y-audit-limited.sh`) reads container memory via `memory.limit_in_bytes` (v1) and `memory.max` (v2). The v2 branch must remain independent (`if`, not `elif`) so both limits are checked in environments where both files exist. When v1 returns a valid (non-sentinel, non-excessive) limit, use it; fall back to v2 only when v1 is unreadable or yields an invalid value.\n- The `scripts/run-w3c-validator.mjs` script must be able to parse vnu output that may include warning messages; it now combines stdout and stderr and extracts a JSON object if necessary.\n\n\n## Use the right numeric target\n\n| Requirement | Baseline / AA minimum | AAA target |\n|---|---:|---:|\n| Normal text contrast | 4.5:1 | 7:1 |\n| Large text contrast | 3:1 | 4.5:1 |\n| UI component / focus contrast | 3:1 (AA; includes the 2.4.11 focus-appearance perimeter/contrast rule) | 3:1 |\n| Pointer target | 24×24 CSS px | 44×44 CSS px unless a documented exception applies |\n| Dragging movements | AA (WCAG 2.2) | AAA requires pointer target ≥44×44 CSS px (time limits covered by separate timing criteria) |\n\nFor AA (WCAG 2.2 SC 2.4.11 Focus Appearance), make the keyboard focus indicator\nat least as large as a two-CSS-pixel perimeter of the unfocused component and\ngive changed pixels at least 3:1 contrast. Ensure no part of a focused\ncomponent is obscured by author-created content.\n\n## Audit → triage → fix → verify\n\n\n1. Install the tools listed in the frontmatter and make Chrome/Chromium plus a\n   matching Chromedriver available. Set `AXE_CHROME_PATH` and\n   `AXE_CHROMEDRIVER_PATH` when auto-detection is insufficient.\n   In low-memory environments (e.g., <2GB RAM), consider using the headless\n   shell and limiting memory via `NODE_OPTIONS` and `ulimit -v`; see\n   `scripts/a11y-audit-limited.sh` for an example.\n\n2. Serve the site over HTTP. Run the reproducible wrapper in\n   [`references/validator-workflow.md`](references/validator-workflow.md).\n\n3. Triage structural and markup errors first, then semantic, visual, operable,\n   and understandable issues. Deduplicate findings across tools; retain raw\n   JSON reports.\n\n4. Fix one coherent group of issues, rerun the audit, and record the result.\n   Review every `incomplete`, `cantTell`, warning, and false-positive decision.\n\n5. For AAA, complete the mandatory manual protocol and evidence matrix before\n   any conformance statement.\n\n## Report precisely\n\nFor each finding, report the route/state, relevant success criterion, affected\nselector or component, user impact, exact change, validation method, and retest\nresult. Say “no automated findings” when that is all the tools establish.\n\n## Optional benchmark extension\n\nThe AI-WCAG-Gauntlet tag-coverage experiment is **not** a production\naccessibility gate. Use it only when the task explicitly requests benchmark\nscoring. Read [`benchmark/README.md`](benchmark/README.md) then; never copy its\nreference template into a benchmark submission.\n\nFile v2.0.11:benchmark/README.md\n\n# Optional AI-WCAG-Gauntlet extension\n\nThis directory supports the AI-WCAG-Gauntlet experiment. It is separate from\nthe production WCAG workflow because tag-count coverage is a benchmark\nconstraint, not evidence of WCAG conformance.\n\n## Use only for an explicit benchmark request\n\n1. Run the Gauntlet setup in its own repository to create a fresh submission\n   directory.\n2. Write original HTML, CSS, and scripts in that submission directory.\n3. Run the local pre-check from this extension:\n\n   ```bash\n   python3 benchmark/scripts/check-tag-coverage.py <submission-directory>/index.html\n   ```\n\n4. Run the Gauntlet test suite and retain its output separately from production\n   accessibility reports.\n\n## Integrity rule\n\n`benchmark/templates/` is reference material only. Do not copy a template or\nthe bare starter into a benchmark submission. A valid benchmark run must contain\nan original implementation tailored to its prompt.\n\nThe tag checker uses `benchmark/resources/html_tags.json` and no longer relies\non an absent root-level `resources/` directory.\n\nFile v2.0.11:_meta.json\n\n{\n  \"ownerId\": \"kn7fmyse3t502fgrgyjqg7q2c98bk706\",\n  \"slug\": \"wcag-skill\",\n  \"version\": \"2.0.11\",\n  \"publishedAt\": 1790234518625\n}\n\nFile v2.0.11:benchmark/references/ai-wcag-gauntlet-iteration-log.md\n\n# AI-WCAG-Gauntlet Iteration Log — DeepSeek V4 Pro (passing run, 6 iterations)\n\nReference for error strings, score progression, and fix history. Repo:\n`turbolego/AI-WCAG-Gauntlet` (private; clone with `gh repo clone turbolego/AI-WCAG-Gauntlet`\nor another scoped auth method — do not reference local credential files).\nModel under test: `deepseek-ai/deepseek-v4-pro` via nvidia provider, label \"Hermes\".\n\n## Score progression\n| Iter | Score  | HTML_TAG | W3C | AXE | Note |\n|------|--------|----------|-----|-----|------|\n| 1    | 12.50  | 107      | 0   | 2   | bare page, no `<main>` (landmark-one-main, region) |\n| 2    | 86.40  | 18       | 0   | 1   | added ~90 tags; target-size remains |\n| 3    | 12.50  | 0        | 43  | 1   | bad bulk rewrite → structural errors |\n| 4    | 96.80  | 0        | 4   | 1   | clean rewrite |\n| 5    | 98.80  | 0        | 2   | 1   | CSS not loading (base href) |\n| 6    | 168.18 | 0        | 0   | 0   | ✅ PASS |\n\n## Exact error strings seen\n- W3C: `Element \"selectedcontent\" not allowed as child of element \"select\" in this context.`\n- W3C: `End tag \"main\" seen, but there were open elements.` + `Unclosed element \"section\".`\n  (line points at the FIRST section, not the offending one)\n- W3C: `The element \"audio\" with the attribute \"controls\" must not appear as a descendant\n  of the \"a\" element.` (same for video/details/dialog/button/embed/iframe/label/input/\n  select/textarea)\n- W3C: `Stray end tag \"fieldset\".`\n- AXE: `target-size — All touch targets must be 24px large, or leave sufficient space`\n  → `Target has insufficient size (39.1px by 18px...)` and/or\n  `Safe clickable space has a diameter of 12px instead of at least 24px.`\n- AXE (iter 1): `landmark-one-main` + `region` — page had no `<main>`, h1 outside landmark.\n\n## Key fixes\n1. `<base href=\"/AI-WCAG-Gauntlet/\">` is injected into generated pages (matches GitHub\n   Pages deployment). Any RELATIVE `href`/`src` (style.css, scripts/dummy.js) resolves\n   against it → 404 at repo root → CSS never applied → axe target-size kept failing.\n   Fix: absolute URLs with %20 encoding:\n   `/AI-WCAG-Gauntlet/benchmarks/DeepSeek%20V4%20Pro/<folder>/style.css`.\n2. `<selectedcontent>` (new-ish HTML element, required by html_tags.json) fails W3C\n   inside `<select>` but passes inside a plain `<div>`. The tag checker only greps for\n   the literal string.\n3. target-size fix: `nav a { min-height: 24px; display: inline-block; padding: 4px 6px; margin: 2px; }`\n   (min-height is the critical part; inline style in `<head>` also works).\n4. Tag coverage: HTML comments are stripped by a custom scanner (see strip_comments()) before `TAG_RE = r\"<\\s*([a-zA-Z][a-zA-Z0-9\\-]*)\\b\"` via `re.findall`,\n   set-diff'd against `benchmark/resources/html_tags.json` (113 tags including\n   `selectedcontent`). The scanner tracks quote state only within tag context to\n   avoid false positives on attribute values containing `<!--`. Because comments\n   are stripped, commented tag literals do NOT count toward coverage —\n   always use a real element for required tags (e.g. <base target=\"_self\">\n       for base coverage and no URL rewrite).\n5. Keep `<section>` nesting closed — every open section needs its `</section>` before\n   `<main>` closes; nested sections must be explicitly terminated.\n\n## Environment notes (do not treat as permanent failures)\n- `npm ci` failed (lockfile out of sync) → `npm install` works.\n- Puppeteer engine wants Node ≥22.12, system had v20.20.0 → non-fatal.\n- Chrome for Testing installed via `npx -y puppeteer@24 browsers install chrome@stable`\n  at `~/.cache/puppeteer/chrome/linux-<ver>/chrome-linux64/chrome`; chromedriver v150\n  matched system Chrome 150.\n\n## Run 2 — fast-path template (2 iterations, SCORE 191.80) — INVALID RESULT\n- Used the known-good template from `templates/` instead of setup.sh's bare starter.\n  This is **reference material only** (see `benchmark/README.md`): copying it into a\n  benchmark submission measures no model behavior, so it is NOT a valid benchmark run.\n  Treat it strictly as a local smoke test of the validators, not a model score.\n- Iteration 1: full page with all 107/113 tags, proper landmarks, absolute CSS paths\n  → FAIL (scored 12.50 due to stale axe report from the starter page).\n- Iteration 2: PASS with 0 errors across all 5 validators, SCORE 191.80 (max).\n- Key insight: **the template is only a validator smoke-test shortcut** — it avoids\n  wasted iterations where the bare starter fails on 107 missing tags + 2 axe\n  violations, saving 4-5 iterations, but a real benchmark must still write original\n  markup tailored to its prompt.\n- New pitfall: `test-suite.sh` starts its own HTTP server — `curl` returning\n  exit 7 between runs just means the server is down, not a broken path. Don't manually\n  `curl` to verify the CSS URL during the run.\n\nFile v2.0.11:benchmark/references/checker-pitfalls.md\n\n# Checker Pitfalls\n\nEdge cases that trip up `check-tag-coverage.py` and tag-balance logic.\nAll cases are verified against `benchmark/resources/html_tags.json` (113 tags).\n\n## HTML comments do not count toward coverage\n\n`check_coverage` strips HTML comments (`<!-- ... -->`) before running\n`TAG_RE` against the document. A commented-out `<base>` literal does NOT\ncount as base coverage. **Always use a real element** for tags required by\n`benchmark/resources/html_tags.json` — a `<base target=\"_self\">` satisfies the tag requirement\nwithout rewriting relative URLs.\n\n## Optional-end-tag tracking is context-sensitive, not global\n\nA stray end tag for an optional-end-tag element (e.g. `</li>`, `</p>`,\n`</rp>`) is **always a parse error** unless that exact element was\nimplicitly closed earlier by an `AUTO_CLOSE_ON_OPEN` rule. Tracking by\ntag name alone causes false negatives: `<p>one<div>two</div><p>three</p></p>`\npasses because the second `</p>` sees `p` was \"previously\" implied-closed,\neven though no `<p>` is open at that point.\n\nCorrect approach: handle all implied closes in `handle_starttag` (pop from\nstack via AUTO_CLOSE_ON_OPEN). A tag not present in the stack at the time\nof `handle_endtag` has no valid open context and is always an error.\n\n## Void elements close open optional-end-tag elements\n\nPer HTML5 parsing, a void element (e.g. `<hr>`) implicitly closes a\npreceding open `<p>` (or other optional-end-tag element). The checker\nmust apply `AUTO_CLOSE_ON_OPEN` rules *before* the void-element early\nreturn in `handle_starttag`, or `<p>text<hr>` leaves an unclosed `<p>`.\n\n## Ruby optional end tags\n\n`<rt>` and `</rp>` have optional end tags in HTML5:\n- `</rt>` before another `<rt>` is legally omitted (self-closes the previous)\n- `</rp>` at end of ruby or before `<rt>` is legally omitted\n\nAdd `rt`/`rp` to `OPTIONAL_END_TAGS` and their close rules to\n`AUTO_CLOSE_ON_OPEN`.\n\n## Table header scope in tfoot\n\n`<tfoot>` row labels use `scope=\"row\"` (the label describes the row).\n`scope=\"col\"` associates the cell with a column instead. For a footer\nsummary row like \"Average\", `scope=\"row\"` is semantically correct.\n\n## Template <base> vs harness <base>\n\nThe AI-WCAG-Gauntlet harness injects `<base href=\"/AI-WCAG-Gauntlet/\">`\ninto benchmark pages. A benchmark template should NOT include its own\n`<base href=...>` (duplicate base elements cause the first to control\nrelative URLs). Use a bare `<base>` (no href) solely for tag-coverage\ncompliance, or rely on the harness-injected base for URL resolution.\n\nFile v2.0.11:references/aaa-evidence-matrix.md\n\n# WCAG 2.2 AAA evidence matrix\n\nUse this template only when the target is WCAG 2.2 AAA. AAA inherits every\napplicable A and AA criterion. Create a row for every applicable A/AA criterion\nfrom the [W3C Quick Reference](https://www.w3.org/WAI/WCAG22/quickref/) and for\nevery AAA criterion below. “Not applicable” must include a concise rationale.\n\n## Required record format\n\n| SC | Applicable? | Route, state, or asset | Evidence and validation method | Result | Residual risk |\n|---|---|---|---|---|---|\n| 1.4.6 | Yes | `/checkout`, all breakpoints | Measured all normal-text pairs at ≥7:1; visual review | Pass | None recorded |\n\nUse `Pass`, `Fail`, `Not applicable`, or `Needs human review`. Do not convert a\ntool warning into a pass without explaining the decision.\n\n## AAA success criteria\n\n| SC | Criterion | Applicability prompt and required evidence |\n|---|---|---|\n| 1.2.6 | Sign Language (Prerecorded) | If prerecorded synchronized media exists, document sign-language interpretation or the applicable exception. |\n| 1.2.7 | Extended Audio Description (Prerecorded) | If prerecorded video has pauses insufficient for description, document extended audio description. |\n| 1.2.8 | Media Alternative (Prerecorded) | If prerecorded synchronized media exists, document a complete media alternative. |\n| 1.2.9 | Audio-only (Live) | If live audio-only exists, document its equivalent alternative. |\n| 1.4.6 | Contrast (Enhanced) | Measure every normal-text pair at ≥7:1 and large-text pair at ≥4.5:1, including hover, focus, disabled, error, and overlay states. |\n| 1.4.7 | Low or No Background Audio | If prerecorded audio has speech, document the audio-control or background-audio exception. |\n| 1.4.8 | Visual Presentation | Check user-adjustable presentation requirements, including foreground/background choice, width, line spacing, and resize behaviour where applicable. |\n| 1.4.9 | Images of Text (No Exception) | Inventory images of text; replace with real text unless the specified exceptions apply. |\n| 2.1.3 | Keyboard (No Exception) | Keyboard-test every function and state; document any functionality that cannot be operated without a keyboard. |\n| 2.2.3 | No Timing | Document that time limits are absent or provide the applicable exception. |\n| 2.2.4 | Interruptions | Document that interruptions can be postponed or suppressed unless essential. |\n| 2.2.5 | Re-authenticating | Re-authenticate a representative session and show that user data is preserved. |\n| 2.2.6 | Timeouts | For inactivity timeouts that can lose data, document warning and preservation for more than 20 hours or the applicable exception. |\n| 2.3.2 | Three Flashes | Inspect all motion/video/ads; document that no content flashes more than three times in any one-second period. |\n| 2.3.3 | Animation from Interactions | Check interaction-triggered motion can be disabled unless essential. |\n| 2.4.8 | Location | For a multi-page set, identify the user’s current location through breadcrumbs, navigation, or another mechanism. |\n| 2.4.9 | Link Purpose (Link Only) | Review every link in isolation; its accessible name must identify purpose except for the criterion’s exceptions. |\n| 2.4.10 | Section Headings | Review long/complex content for descriptive section headings where headings organise content. |\n| 2.4.12 | Focus Not Obscured (Enhanced) | Tab through every breakpoint, overlay, sticky region, error state, and menu; no part of the focused component may be hidden by author content. |\n| 2.4.13 | Focus Appearance | Measure a focus indicator at least equal to a two-CSS-pixel perimeter of the component and ≥3:1 changed-pixel contrast. |\n| 2.5.5 | Target Size (Enhanced) | Measure pointer targets at ≥44×44 CSS px or document the specific exception. |\n| 2.5.6 | Concurrent Input Mechanisms | Confirm no author-created restriction disables a supported input mechanism. |\n| 3.1.3 | Unusual Words | Identify idioms, jargon, and specialised terms; provide a mechanism for definition when needed. |\n| 3.1.4 | Abbreviations | Identify abbreviations whose expanded form is needed for understanding; provide a mechanism for expansion. |\n| 3.1.5 | Reading Level | If primary content exceeds lower-secondary reading level, provide supplemental content or an alternative version at that level. |\n| 3.1.6 | Pronunciation | Where pronunciation is necessary to understand a word’s meaning, provide a mechanism for it. |\n| 3.2.5 | Change on Request | Confirm context changes occur only at user request or document the criterion exception. |\n| 3.3.5 | Help | Where context-sensitive help is available, provide it. |\n| 3.3.6 | Error Prevention (All) | For legal, financial, test, or data-changing submissions, demonstrate reversibility, review/correction, and confirmation. |\n| 3.3.9 | Accessible Authentication (Enhanced) | Test each authentication step; do not require a cognitive-function test unless an allowed alternative or mechanism is available. Do not rely on object recognition or personal content as the enhanced-level exception. |\n\n## Inherited WCAG 2.2 requirements to call out\n\nAAA also requires all applicable A and AA criteria. The AAA table above already\nincludes 2.4.12 Focus Not Obscured (Enhanced), 2.4.13 Focus Appearance, and\n3.3.9 Accessible Authentication (Enhanced) — do not duplicate rows for those.\nExplicitly verify the remaining WCAG 2.2 additions that are A/AA level: 2.4.11\nFocus Not Obscured (Minimum), 2.5.7 Dragging Movements, 2.5.8 Target Size\n(Minimum), 3.2.6 Consistent Help, 3.3.7 Redundant Entry, and 3.3.8 Accessible\nAuthentication (Minimum). Consult the W3C Quick Reference for the full\ninherited set.\n\nFile v2.0.11:references/manual-test-protocol.md\n\n# Mandatory human-test protocol\n\nComplete this protocol for every AAA audit and record the result in the evidence\nmatrix. Test every route, responsive variation, overlay, error path, and\nthird-party flow in scope. Mark a test not applicable only with a rationale.\n\n## Keyboard and focus\n\n1. Use only Tab, Shift+Tab, Enter, Space, Escape, arrow keys, and native\n   shortcuts where relevant. Reach and operate every function without a trap.\n2. Record the focus order through menus, modals, disclosures, custom widgets,\n   validation errors, and dynamically added content. Ensure it follows a\n   meaningful reading and operation order.\n3. At every breakpoint and scroll position, confirm focus is fully visible,\n   unobscured by sticky/overlay content, and meets the AAA focus-area and\n   contrast requirements.\n\n## Responsive and visual presentation\n\n1. Test text resize to 200%, then reflow at 320 CSS pixels or 400% browser zoom\n   without ordinary two-dimensional scrolling, clipping, overlap, or loss of\n   content/function.\n2. Apply the WCAG text-spacing override: line height 1.5, paragraph spacing 2,\n   letter spacing 0.12em, and word spacing 0.16em. Confirm content and controls\n   still work.\n3. Measure every rendered text/background pair and every interactive state.\n   Review text over images, transparency, gradients, charts, and canvases\n   separately; do not infer contrast from a parent background.\n\n## Motion, timing, and media\n\n1. Enable reduced motion and confirm non-essential motion stops or is reduced.\n2. Test time limits, interruption controls, reauthentication, and inactivity\n   timeouts with entered data. Verify the relevant AAA preservation rules.\n3. Review all video, audio, animation, and live media against the applicable\n   captions, description, transcript, sign-language, and media-alternative rows.\n4. Inspect flashing or rapidly changing content for seizure risk and provide a\n   pause/stop/hide mechanism for applicable moving content.\n\n## Forms, authentication, and understanding\n\n1. Trigger each validation error. Confirm the error is identified in text,\n   linked to the control where appropriate, preserves valid entries, and can be\n   corrected by keyboard and assistive technology.\n2. Test review, correction, confirmation, and reversal paths for submissions\n   involving legal commitments, financial transactions, tests, or data changes.\n3. Test every authentication step with password-manager paste, copy/paste, and\n   an alternative that avoids disallowed cognitive tests.\n4. Review help, labels, instructions, unusual words, abbreviations, reading\n   level, and pronunciation needs for the actual audience and task.\n\n## Assistive technology and reporting\n\nTest custom widgets, live regions, dialogs, dynamic errors, and complex controls\nwith at least one supported browser/screen-reader pair. Verify accessible names,\nroles, values, state changes, announcements, and return-focus behaviour. Record\nbrowser, assistive technology, version, date, tested route/state, and observed\nresult. Include disabled users in usability testing when possible; automated and\nfunctional checks alone do not establish real-world usability.\n\nFile v2.0.11:references/validator-workflow.md\n\n# Reproducible validator workflow\n\nUse this workflow after the page is reachable over HTTP. It intentionally uses\nwrapper scripts because package CLIs differ by version; do not copy obsolete\nflags from blog posts or old reports.\n\n## Prerequisites\n\nInstall the pinned Node tools from [`package.json`](../package.json) and a\nChromium-family browser plus matching Chromedriver. `vnu-jar` needs Java.\n\n```bash\nnpm ci\n# Install or provide Chrome/Chromium separately, matching the chromedriver\n# major version pinned in package.json.\n```\n\nIf the browser or driver is not detected, set both paths explicitly:\n\n```bash\nexport AXE_CHROME_PATH=\"$(command -v chromium)\"\nexport AXE_CHROMEDRIVER_PATH=\"$(command -v chromedriver)\"\n```\n\n## Run all automated checks\n\nFrom the skill root, serve the target application separately, then run:\n\n```bash\nbash scripts/a11y-audit.sh http://localhost:8000 ./a11y-reports\n```\n\nThe wrapper writes `axe_report.json`, `pa11y_report.json`,\n`qualweb_report.json`, and `w3c_source_html_report.json`. It resolves\nQualWeb's actual installed entry point instead of assuming a `qualweb`\nexecutable, uses axe's supported `--stdout` option, and validates fetched HTML\nwith the Nu checker.\n\n`w3c_source_html_report.json` only validates the raw HTTP response body\n(`scope: \"source-html\"` in the report). It does not see DOM mutations from\nJavaScript, authenticated routes, or other post-load states — those require\nthe browser-based tools (axe, Pa11y, QualWeb) run against each relevant state.\n\n## Read results\n\nTreat every `violations`, `incomplete`, `cantTell`, warning, and markup message\nas a review item. A clean automated report means only that the executed rules\nfound no violations; it does not establish WCAG conformance.\n\nFor AAA work, continue with the evidence matrix and manual protocol. For a\nproduction conformance claim, assess the complete set of pages and process\nsteps, including responsive variations and third-party content in scope.\n\nFile v2.0.11:skill-card.md\n\n## Description:\n\nBuild, audit, and repair web content against WCAG 2.2. Use when creating accessible HTML/CSS/JS, remediating accessibility defects, running reproducible automated audits, preparing WCAG 2.2 AAA evidence and human-test records, or running the optional AI-WCAG-Gauntlet benchmark.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[turbolego](https://clawhub.ai/user/turbolego)\n\n### License/Terms of Use:\n\nMIT\n\n## Use Case:\n\nDevelopers and accessibility engineers use this skill to build accessible web pages, audit existing pages against WCAG 2.2, triage automated findings, and prepare AAA evidence records that require manual review.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill may run local browser-based accessibility tooling and fetch pages provided for audit.\n\nMitigation: Install it only in environments where local browser automation and page fetching are acceptable, and review target URLs before running audits.\n\nRisk: Automated reports can miss WCAG issues or include findings that need judgment.\n\nMitigation: Review violations, warnings, incomplete results, and false-positive decisions manually before making any conformance claim.\n\nRisk: Chrome, Chromedriver, Java, npm packages, and low-memory hosts can affect audit reliability.\n\nMitigation: Use the documented environment variables and low-memory audit wrapper, keep browser and driver versions aligned, and use Java 17 or newer for vnu.\n\nRisk: The optional AI-WCAG-Gauntlet benchmark uses tag coverage and is not production accessibility evidence.\n\nMitigation: Use benchmark materials only for explicit benchmark tasks and keep benchmark results separate from production WCAG evidence.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/turbolego/skills/wcag-skill)\n- [Skill homepage](https://github.com/turbolego/wcag-skill)\n- [W3C WCAG 2.2 Quick Reference](https://www.w3.org/WAI/WCAG22/quickref/)\n- [Reproducible validator workflow](references/validator-workflow.md)\n- [WCAG 2.2 AAA evidence matrix](references/aaa-evidence-matrix.md)\n- [Mandatory human-test protocol](references/manual-test-protocol.md)\n- [Optional AI-WCAG-Gauntlet extension](benchmark/README.md)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, code, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown guidance with inline code, shell commands, audit-report descriptions, and evidence-table guidance]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Automated accessibility results are treated as evidence for review, not proof of WCAG conformance.]\n\n## Skill Version(s):\n\n2.0.11 (source: frontmatter and server release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v2.0.11:benchmark/resources/html_tags.json\n\n{\n  \"tags\": [\n    \"a\", \"abbr\", \"address\", \"area\", \"article\", \"aside\", \"audio\", \"b\", \"base\", \"bdi\", \"bdo\", \"blockquote\", \"body\", \"br\", \"button\", \"canvas\", \"caption\", \"cite\", \"code\", \"col\", \"colgroup\", \"data\", \"datalist\", \"dd\", \"del\", \"details\", \"dfn\", \"dialog\", \"div\", \"dl\", \"dt\", \"em\", \"embed\", \"fieldset\", \"figcaption\", \"figure\", \"footer\", \"form\", \"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\", \"head\", \"header\", \"hgroup\", \"hr\", \"html\", \"i\", \"iframe\", \"img\", \"input\", \"ins\", \"kbd\", \"label\", \"legend\", \"li\", \"link\", \"main\", \"map\", \"mark\", \"menu\", \"meta\", \"meter\", \"nav\", \"noscript\", \"object\", \"ol\", \"optgroup\", \"option\", \"output\", \"p\", \"picture\", \"pre\", \"progress\", \"q\", \"rp\", \"rt\", \"ruby\", \"s\", \"samp\", \"script\", \"search\", \"section\", \"select\", \"selectedcontent\", \"slot\", \"small\", \"source\", \"span\", \"strong\", \"style\", \"sub\", \"summary\", \"sup\", \"table\", \"tbody\", \"td\", \"template\", \"textarea\", \"tfoot\", \"th\", \"thead\", \"time\", \"title\", \"tr\", \"track\", \"u\", \"ul\", \"var\", \"video\", \"wbr\"\n  ]\n}\n\nFile v2.0.11:renovate.json\n\n{\n  \"$schema\": \"https://docs.renovatebot.com/renovate-schema.json\",\n  \"extends\": [\n    \"config:recommended\"\n  ]\n}\n\nFile v2.0.11:LICENSE\n\nMIT License\n\nCopyright (c) 2026 Tobias Andersen\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\nArchive v2.0.10: 20 files, 30873 bytes\n\nFiles: .clawhubignore (813b), benchmark/README.md (1059b), benchmark/references/ai-wcag-gauntlet-iteration-log.md (4850b), benchmark/references/checker-pitfalls.md (2526b), benchmark/resources/html_tags.json (975b), benchmark/scripts/check-tag-coverage.py (8790b), benchmark/templates/dummy.js (117b), benchmark/templates/index.html (14383b), benchmark/templates/style.css (998b), LICENSE (1072b), references/aaa-evidence-matrix.md (5644b), references/manual-test-protocol.md (3168b), references/validator-workflow.md (1967b), renovate.json (114b), scripts/a11y-audit-limited.sh (3672b), scripts/a11y-audit.sh (4424b), scripts/run-w3c-validator.mjs (1927b), skill-card.md (2785b), SKILL.md (6298b), _meta.json (130b)\n\nFile v2.0.10:SKILL.md\n\n---\nname: wcag-skill\ndescription: \"Build, audit, and repair web content against WCAG 2.2. Use when: (1) creating accessible HTML/CSS/JS, (2) remediating accessibility defects, (3) running reproducible automated audits, (4) preparing WCAG 2.2 AAA evidence and human-test records, or (5) running the optional AI-WCAG-Gauntlet benchmark.\"\nmetadata:\n  version: 2.0.10\n  openclaw:\n    requires:\n      bins:\n        - node\n        - npm\n        - python3\n        - curl\n        - java\n    envVars:\n      - name: AXE_CHROME_PATH\n        required: false\n        description: Explicit Chrome/Chromium binary path for scripts/a11y-audit.sh when auto-detection fails.\n      - name: AXE_CHROMEDRIVER_PATH\n        required: false\n        description: Explicit Chromedriver binary path for scripts/a11y-audit.sh when auto-detection fails.\n    install:\n      - kind: node\n        package: \"@axe-core/cli\"\n        bins: [axe]\n      - kind: node\n        package: pa11y\n        bins: [pa11y]\n      - kind: node\n        package: \"@qualweb/cli\"\n        bins: [qw]\n      - kind: node\n        package: vnu-jar\n        bins: [vnu]\n      - kind: node\n        package: chromedriver\n        bins: [chromedriver]\n    homepage: https://github.com/turbolego/wcag-skill\n---\n\n# WCAG 2.2 Accessibility\n\nUse this skill to build or audit web content. Prefer native HTML, test through\nHTTP, and treat automated output as evidence—not proof of conformance.\n\n## Choose the scope first\n\n1. Inventory every route, breakpoint, interactive state, overlay, error path,\n   media item, authentication step, and third-party component in scope.\n2. Set the target: `baseline`, `AA`, or `AAA`.\n3. For an AAA target, read **all three** references before implementation:\n   - [`references/validator-workflow.md`](references/validator-workflow.md)\n   - [`references/aaa-evidence-matrix.md`](references/aaa-evidence-matrix.md)\n   - [`references/manual-test-protocol.md`](references/manual-test-protocol.md)\n\n> Do not say “WCAG AAA compliant” from automated results. Level AAA requires\n> every applicable A, AA, and AAA success criterion for the full page and any\n> complete process. Record an explicit evidence row or non-applicability\n> rationale for each criterion.\n\n## Build accessible by default\n\n- Use one `<main>`, a meaningful `<title>`, one clear `<h1>`, and landmarks\n  only where their semantics help orientation. Use `<section>` for a meaningful\n  thematic grouping; give it an accessible heading when that improves its name.\n  Use `<div>` for visual grouping alone.\n- Use real `<a>`, `<button>`, `<input>`, `<select>`, `<textarea>`, and native\n  disclosure/dialog patterns before inventing ARIA widgets. Never put a\n  focusable element inside `aria-hidden=\"true\"` content.\n- Give informative images equivalent text; use `alt=\"\"` only for decorative\n  images. Provide the relevant captions, transcript, audio description, or\n  media alternative for media.\n- Label every form control, group related controls with `<fieldset><legend>`,\n  use appropriate input types and `autocomplete`, preserve entered data after\n  recoverable errors, and identify errors in text as well as colour.\n- Keep DOM order aligned with reading and Tab order. Provide a skip link,\n  visible focus, keyboard operation, and no keyboard trap.\n- Do not communicate status, errors, required fields, or instructions by colour,\n  position, shape, or sound alone. Respect `prefers-reduced-motion`.\n- Ensure pointer targets are at least 24×24 CSS px (AA) or 44×44 CSS px (AAA) unless an exception applies.\n- Ensure dragging movements can be operated with a single pointer without dragging (AA, unless dragging is essential) and provide alternatives or cancellation; timing limits on dragging are covered by separate timing criteria.\n- Make sure the keyboard focus indicator is visible and has sufficient contrast (AA, WCAG 2.2 SC 2.4.11 Focus Appearance: at least 2 CSS px perimeter and 3:1 contrast).\n\n## Use the right numeric target\n\n| Requirement | Baseline / AA minimum | AAA target |\n|---|---:|---:|\n| Normal text contrast | 4.5:1 | 7:1 |\n| Large text contrast | 3:1 | 4.5:1 |\n| UI component / focus contrast | 3:1 (AA; includes the 2.4.11 focus-appearance perimeter/contrast rule) | 3:1 |\n| Pointer target | 24×24 CSS px | 44×44 CSS px unless a documented exception applies |\n| Dragging movements | AA (WCAG 2.2) | AAA requires pointer target ≥44×44 CSS px and no time limits on dragging |\n\nFor AA (WCAG 2.2 SC 2.4.11 Focus Appearance), make the keyboard focus indicator\nat least as large as a two-CSS-pixel perimeter of the unfocused component and\ngive changed pixels at least 3:1 contrast. Ensure no part of a focused\ncomponent is obscured by author-created content.\n\n## Audit → triage → fix → verify\n\n\n1. Install the tools listed in the frontmatter and make Chrome/Chromium plus a\n   matching Chromedriver available. Set `AXE_CHROME_PATH` and\n   `AXE_CHROMEDRIVER_PATH` when auto-detection is insufficient.\n   In low-memory environments (e.g., <2GB RAM), consider using the headless\n   shell and limiting memory via `NODE_OPTIONS` and `ulimit -v`; see\n   `scripts/a11y-audit-limited.sh` for an example.\n\n2. Serve the site over HTTP. Run the reproducible wrapper in\n   [`references/validator-workflow.md`](references/validator-workflow.md).\n\n3. Triage structural and markup errors first, then semantic, visual, operable,\n   and understandable issues. Deduplicate findings across tools; retain raw\n   JSON reports.\n\n4. Fix one coherent group of issues, rerun the audit, and record the result.\n   Review every `incomplete`, `cantTell`, warning, and false-positive decision.\n\n5. For AAA, complete the mandatory manual protocol and evidence matrix before\n   any conformance statement.\n\n## Report precisely\n\nFor each finding, report the route/state, relevant success criterion, affected\nselector or component, user impact, exact change, validation method, and retest\nresult. Say “no automated findings” when that is all the tools establish.\n\n## Optional benchmark extension\n\nThe AI-WCAG-Gauntlet tag-coverage experiment is **not** a production\naccessibility gate. Use it only when the task explicitly requests benchmark\nscoring. Read [`benchmark/README.md`](benchmark/README.md) then; never copy its\nreference template into a benchmark submission.\n\nFile v2.0.10:benchmark/README.md\n\n# Optional AI-WCAG-Gauntlet extension\n\nThis directory supports the AI-WCAG-Gauntlet experiment. It is separate from\nthe production WCAG workflow because tag-count coverage is a benchmark\nconstraint, not evidence of WCAG conformance.\n\n## Use only for an explicit benchmark request\n\n1. Run the Gauntlet setup in its own repository to create a fresh submission\n   directory.\n2. Write original HTML, CSS, and scripts in that submission directory.\n3. Run the local pre-check from this extension:\n\n   ```bash\n   python3 benchmark/scripts/check-tag-coverage.py <submission-directory>/index.html\n   ```\n\n4. Run the Gauntlet test suite and retain its output separately from production\n   accessibility reports.\n\n## Integrity rule\n\n`benchmark/templates/` is reference material only. Do not copy a template or\nthe bare starter into a benchmark submission. A valid benchmark run must contain\nan original implementation tailored to its prompt.\n\nThe tag checker uses `benchmark/resources/html_tags.json` and no longer relies\non an absent root-level `resources/` directory.\n\nFile v2.0.10:_meta.json\n\n{\n  \"ownerId\": \"kn7fmyse3t502fgrgyjqg7q2c98bk706\",\n  \"slug\": \"wcag-skill\",\n  \"version\": \"2.0.10\",\n  \"publishedAt\": 1790183672965\n}\n\nFile v2.0.10:benchmark/references/ai-wcag-gauntlet-iteration-log.md\n\n# AI-WCAG-Gauntlet Iteration Log — DeepSeek V4 Pro (passing run, 6 iterations)\n\nReference for error strings, score progression, and fix history. Repo:\n`turbolego/AI-WCAG-Gauntlet` (private; clone with `gh repo clone turbolego/AI-WCAG-Gauntlet`\nor another scoped auth method — do not reference local credential files).\nModel under test: `deepseek-ai/deepseek-v4-pro` via nvidia provider, label \"Hermes\".\n\n## Score progression\n| Iter | Score  | HTML_TAG | W3C | AXE | Note |\n|------|--------|----------|-----|-----|------|\n| 1    | 12.50  | 107      | 0   | 2   | bare page, no `<main>` (landmark-one-main, region) |\n| 2    | 86.40  | 18       | 0   | 1   | added ~90 tags; target-size remains |\n| 3    | 12.50  | 0        | 43  | 1   | bad bulk rewrite → structural errors |\n| 4    | 96.80  | 0        | 4   | 1   | clean rewrite |\n| 5    | 98.80  | 0        | 2   | 1   | CSS not loading (base href) |\n| 6    | 168.18 | 0        | 0   | 0   | ✅ PASS |\n\n## Exact error strings seen\n- W3C: `Element \"selectedcontent\" not allowed as child of element \"select\" in this context.`\n- W3C: `End tag \"main\" seen, but there were open elements.` + `Unclosed element \"section\".`\n  (line points at the FIRST section, not the offending one)\n- W3C: `The element \"audio\" with the attribute \"controls\" must not appear as a descendant\n  of the \"a\" element.` (same for video/details/dialog/button/embed/iframe/label/input/\n  select/textarea)\n- W3C: `Stray end tag \"fieldset\".`\n- AXE: `target-size — All touch targets must be 24px large, or leave sufficient space`\n  → `Target has insufficient size (39.1px by 18px...)` and/or\n  `Safe clickable space has a diameter of 12px instead of at least 24px.`\n- AXE (iter 1): `landmark-one-main` + `region` — page had no `<main>`, h1 outside landmark.\n\n## Key fixes\n1. `<base href=\"/AI-WCAG-Gauntlet/\">` is injected into generated pages (matches GitHub\n   Pages deployment). Any RELATIVE `href`/`src` (style.css, scripts/dummy.js) resolves\n   against it → 404 at repo root → CSS never applied → axe target-size kept failing.\n   Fix: absolute URLs with %20 encoding:\n   `/AI-WCAG-Gauntlet/benchmarks/DeepSeek%20V4%20Pro/<folder>/style.css`.\n2. `<selectedcontent>` (new-ish HTML element, required by html_tags.json) fails W3C\n   inside `<select>` but passes inside a plain `<div>`. The tag checker only greps for\n   the literal string.\n3. target-size fix: `nav a { min-height: 24px; display: inline-block; padding: 4px 6px; margin: 2px; }`\n   (min-height is the critical part; inline style in `<head>` also works).\n4. Tag coverage: HTML comments are stripped by a custom scanner (see strip_comments()) before `TAG_RE = r\"<\\s*([a-zA-Z][a-zA-Z0-9\\-]*)\\b\"` via `re.findall`,\n   set-diff'd against `benchmark/resources/html_tags.json` (113 tags including\n   `selectedcontent`). The scanner tracks quote state only within tag context to\n   avoid false positives on attribute values containing `<!--`. Because comments\n   are stripped, commented tag literals do NOT count toward coverage —\n   always use a real element for required tags (e.g. <base target=\"_self\">\n       for base coverage and no URL rewrite).\n5. Keep `<section>` nesting closed — every open section needs its `</section>` before\n   `<main>` closes; nested sections must be explicitly terminated.\n\n## Environment notes (do not treat as permanent failures)\n- `npm ci` failed (lockfile out of sync) → `npm install` works.\n- Puppeteer engine wants Node ≥22.12, system had v20.20.0 → non-fatal.\n- Chrome for Testing installed via `npx -y puppeteer@24 browsers install chrome@stable`\n  at `~/.cache/puppeteer/chrome/linux-<ver>/chrome-linux64/chrome`; chromedriver v150\n  matched system Chrome 150.\n\n## Run 2 — fast-path template (2 iterations, SCORE 191.80) — INVALID RESULT\n- Used the known-good template from `templates/` instead of setup.sh's bare starter.\n  This is **reference material only** (see `benchmark/README.md`): copying it into a\n  benchmark submission measures no model behavior, so it is NOT a valid benchmark run.\n  Treat it strictly as a local smoke test of the validators, not a model score.\n- Iteration 1: full page with all 107/113 tags, proper landmarks, absolute CSS paths\n  → FAIL (scored 12.50 due to stale axe report from the starter page).\n- Iteration 2: PASS with 0 errors across all 5 validators, SCORE 191.80 (max).\n- Key insight: **the template is only a validator smoke-test shortcut** — it avoids\n  wasted iterations where the bare starter fails on 107 missing tags + 2 axe\n  violations, saving 4-5 iterations, but a real benchmark must still write original\n  markup tailored to its prompt.\n- New pitfall: `test-suite.sh` starts its own HTTP server — `curl` returning\n  exit 7 between runs just means the server is down, not a broken path. Don't manually\n  `curl` to verify the CSS URL during the run.\n\nFile v2.0.10:benchmark/references/checker-pitfalls.md\n\n# Checker Pitfalls\n\nEdge cases that trip up `check-tag-coverage.py` and tag-balance logic.\nAll cases are verified against `benchmark/resources/html_tags.json` (113 tags).\n\n## HTML comments do not count toward coverage\n\n`check_coverage` strips HTML comments (`<!-- ... -->`) before running\n`TAG_RE` against the document. A commented-out `<base>` literal does NOT\ncount as base coverage. **Always use a real element** for tags required by\n`benchmark/resources/html_tags.json` — a `<base target=\"_self\">` satisfies the tag requirement\nwithout rewriting relative URLs.\n\n## Optional-end-tag tracking is context-sensitive, not global\n\nA stray end tag for an optional-end-tag element (e.g. `</li>`, `</p>`,\n`</rp>`) is **always a parse error** unless that exact element was\nimplicitly closed earlier by an `AUTO_CLOSE_ON_OPEN` rule. Tracking by\ntag name alone causes false negatives: `<p>one<div>two</div><p>three</p></p>`\npasses because the second `</p>` sees `p` was \"previously\" implied-closed,\neven though no `<p>` is open at that point.\n\nCorrect approach: handle all implied closes in `handle_starttag` (pop from\nstack via AUTO_CLOSE_ON_OPEN). A tag not present in the stack at the time\nof `handle_endtag` has no valid open context and is always an error.\n\n## Void elements close open optional-end-tag elements\n\nPer HTML5 parsing, a void element (e.g. `<hr>`) implicitly closes a\npreceding open `<p>` (or other optional-end-tag element). The checker\nmust apply `AUTO_CLOSE_ON_OPEN` rules *before* the void-element early\nreturn in `handle_starttag`, or `<p>text<hr>` leaves an unclosed `<p>`.\n\n## Ruby optional end tags\n\n`<rt>` and `</rp>` have optional end tags in HTML5:\n- `</rt>` before another `<rt>` is legally omitted (self-closes the previous)\n- `</rp>` at end of ruby or before `<rt>` is legally omitted\n\nAdd `rt`/`rp` to `OPTIONAL_END_TAGS` and their close rules to\n`AUTO_CLOSE_ON_OPEN`.\n\n## Table header scope in tfoot\n\n`<tfoot>` row labels use `scope=\"row\"` (the label describes the row).\n`scope=\"col\"` associates the cell with a column instead. For a footer\nsummary row like \"Average\", `scope=\"row\"` is semantically correct.\n\n## Template <base> vs harness <base>\n\nThe AI-WCAG-Gauntlet harness injects `<base href=\"/AI-WCAG-Gauntlet/\">`\ninto benchmark pages. A benchmark template should NOT include its own\n`<base href=...>` (duplicate base elements cause the first to control\nrelative URLs). Use a bare `<base>` (no href) solely for tag-coverage\ncompliance, or rely on the harness-injected base for URL resolution.\n\nFile v2.0.10:references/aaa-evidence-matrix.md\n\n# WCAG 2.2 AAA evidence matrix\n\nUse this template only when the target is WCAG 2.2 AAA. AAA inherits every\napplicable A and AA criterion. Create a row for every applicable A/AA criterion\nfrom the [W3C Quick Reference](https://www.w3.org/WAI/WCAG22/quickref/) and for\nevery AAA criterion below. “Not applicable” must include a concise rationale.\n\n## Required record format\n\n| SC | Applicable? | Route, state, or asset | Evidence and validation method | Result | Residual risk |\n|---|---|---|---|---|---|\n| 1.4.6 | Yes | `/checkout`, all breakpoints | Measured all normal-text pairs at ≥7:1; visual review | Pass | None recorded |\n\nUse `Pass`, `Fail`, `Not applicable`, or `Needs human review`. Do not convert a\ntool warning into a pass without explaining the decision.\n\n## AAA success criteria\n\n| SC | Criterion | Applicability prompt and required evidence |\n|---|---|---|\n| 1.2.6 | Sign Language (Prerecorded) | If prerecorded synchronized media exists, document sign-language interpretation or the applicable exception. |\n| 1.2.7 | Extended Audio Description (Prerecorded) | If prerecorded video has pauses insufficient for description, document extended audio description. |\n| 1.2.8 | Media Alternative (Prerecorded) | If prerecorded synchronized media exists, document a complete media alternative. |\n| 1.2.9 | Audio-only (Live) | If live audio-only exists, document its equivalent alternative. |\n| 1.4.6 | Contrast (Enhanced) | Measure every normal-text pair at ≥7:1 and large-text pair at ≥4.5:1, including hover, focus, disabled, error, and overlay states. |\n| 1.4.7 | Low or No Background Audio | If prerecorded audio has speech, document the audio-control or background-audio exception. |\n| 1.4.8 | Visual Presentation | Check user-adjustable presentation requirements, including foreground/background choice, width, line spacing, and resize behaviour where applicable. |\n| 1.4.9 | Images of Text (No Exception) | Inventory images of text; replace with real text unless the specified exceptions apply. |\n| 2.1.3 | Keyboard (No Exception) | Keyboard-test every function and state; document any functionality that cannot be operated without a keyboard. |\n| 2.2.3 | No Timing | Document that time limits are absent or provide the applicable exception. |\n| 2.2.4 | Interruptions | Document that interruptions can be postponed or suppressed unless essential. |\n| 2.2.5 | Re-authenticating | Re-authenticate a representative session and show that user data is preserved. |\n| 2.2.6 | Timeouts | For inactivity timeouts that can lose data, document warning and preservation for more than 20 hours or the applicable exception. |\n| 2.3.2 | Three Flashes | Inspect all motion/video/ads; document that no content flashes more than three times in any one-second period. |\n| 2.3.3 | Animation from Interactions | Check interaction-triggered motion can be disabled unless essential. |\n| 2.4.8 | Location | For a multi-page set, identify the user’s current location through breadcrumbs, navigation, or another mechanism. |\n| 2.4.9 | Link Purpose (Link Only) | Review every link in isolation; its accessible name must identify purpose except for the criterion’s exceptions. |\n| 2.4.10 | Section Headings | Review long/complex content for descriptive section headings where headings organise content. |\n| 2.4.12 | Focus Not Obscured (Enhanced) | Tab through every breakpoint, overlay, sticky region, error state, and menu; no part of the focused component may be hidden by author content. |\n| 2.4.13 | Focus Appearance | Measure a focus indicator at least equal to a two-CSS-pixel perimeter of the component and ≥3:1 changed-pixel contrast. |\n| 2.5.5 | Target Size (Enhanced) | Measure pointer targets at ≥44×44 CSS px or document the specific exception. |\n| 2.5.6 | Concurrent Input Mechanisms | Confirm no author-created restriction disables a supported input mechanism. |\n| 3.1.3 | Unusual Words | Identify idioms, jargon, and specialised terms; provide a mechanism for definition when needed. |\n| 3.1.4 | Abbreviations | Identify abbreviations whose expanded form is needed for understanding; provide a mechanism for expansion. |\n| 3.1.5 | Reading Level | If primary content exceeds lower-secondary reading level, provide supplemental content or an alternative version at that level. |\n| 3.1.6 | Pronunciation | Where pronunciation is necessary to understand a word’s meaning, provide a mechanism for it. |\n| 3.2.5 | Change on Request | Confirm context changes occur only at user request or document the criterion exception. |\n| 3.3.5 | Help | Where context-sensitive help is available, provide it. |\n| 3.3.6 | Error Prevention (All) | For legal, financial, test, or data-changing submissions, demonstrate reversibility, review/correction, and confirmation. |\n| 3.3.9 | Accessible Authentication (Enhanced) | Test each authentication step; do not require a cognitive-function test unless an allowed alternative or mechanism is available. Do not rely on object recognition or personal content as the enhanced-level exception. |\n\n## Inherited WCAG 2.2 requirements to call out\n\nAAA also requires all applicable A and AA criteria. The AAA table above already\nincludes 2.4.12 Focus Not Obscured (Enhanced), 2.4.13 Focus Appearance, and\n3.3.9 Accessible Authentication (Enhanced) — do not duplicate rows for those.\nExplicitly verify the remaining WCAG 2.2 additions that are A/AA level: 2.4.11\nFocus Not Obscured (Minimum), 2.5.7 Dragging Movements, 2.5.8 Target Size\n(Minimum), 3.2.6 Consistent Help, 3.3.7 Redundant Entry, and 3.3.8 Accessible\nAuthentication (Minimum). Consult the W3C Quick Reference for the full\ninherited set.\n\nFile v2.0.10:references/manual-test-protocol.md\n\n# Mandatory human-test protocol\n\nComplete this protocol for every AAA audit and record the result in the evidence\nmatrix. Test every route, responsive variation, overlay, error path, and\nthird-party flow in scope. Mark a test not applicable only with a rationale.\n\n## Keyboard and focus\n\n1. Use only Tab, Shift+Tab, Enter, Space, Escape, arrow keys, and native\n   shortcuts where relevant. Reach and operate every function without a trap.\n2. Record the focus order through menus, modals, disclosures, custom widgets,\n   validation errors, and dynamically added content. Ensure it follows a\n   meaningful reading and operation order.\n3. At every breakpoint and scroll position, confirm focus is fully visible,\n   unobscured by sticky/overlay content, and meets the AAA focus-area and\n   contrast requirements.\n\n## Responsive and visual presentation\n\n1. Test text resize to 200%, then reflow at 320 CSS pixels or 400% browser zoom\n   without ordinary two-dimensional scrolling, clipping, overlap, or loss of\n   content/function.\n2. Apply the WCAG text-spacing override: line height 1.5, paragraph spacing 2,\n   letter spacing 0.12em, and word spacing 0.16em. Confirm content and controls\n   still work.\n3. Measure every rendered text/background pair and every interactive state.\n   Review text over images, transparency, gradients, charts, and canvases\n   separately; do not infer contrast from a parent background.\n\n## Motion, timing, and media\n\n1. Enable reduced motion and confirm non-essential motion stops or is reduced.\n2. Test time limits, interruption controls, reauthentication, and inactivity\n   timeouts with entered data. Verify the relevant AAA preservation rules.\n3. Review all video, audio, animation, and live media against the applicable\n   captions, description, transcript, sign-language, and media-alternative rows.\n4. Inspect flashing or rapidly changing content for seizure risk and provide a\n   pause/stop/hide mechanism for applicable moving content.\n\n## Forms, authentication, and understanding\n\n1. Trigger each validation error. Confirm the error is identified in text,\n   linked to the control where appropriate, preserves valid entries, and can be\n   corrected by keyboard and assistive technology.\n2. Test review, correction, confirmation, and reversal paths for submissions\n   involving legal commitments, financial transactions, tests, or data changes.\n3. Test every authentication step with password-manager paste, copy/paste, and\n   an alternative that avoids disallowed cognitive tests.\n4. Review help, labels, instructions, unusual words, abbreviations, reading\n   level, and pronunciation needs for the actual audience and task.\n\n## Assistive technology and reporting\n\nTest custom widgets, live regions, dialogs, dynamic errors, and complex controls\nwith at least one supported browser/screen-reader pair. Verify accessible names,\nroles, values, state changes, announcements, and return-focus behaviour. Record\nbrowser, assistive technology, version, date, tested route/state, and observed\nresult. Include disabled users in usability testing when possible; automated and\nfunctional checks alone do not establish real-world usability.\n\nFile v2.0.10:references/validator-workflow.md\n\n# Reproducible validator workflow\n\nUse this workflow after the page is reachable over HTTP. It intentionally uses\nwrapper scripts because package CLIs differ by version; do not copy obsolete\nflags from blog posts or old reports.\n\n## Prerequisites\n\nInstall the pinned Node tools from [`package.json`](../package.json) and a\nChromium-family browser plus matching Chromedriver. `vnu-jar` needs Java.\n\n```bash\nnpm ci\n# Install or provide Chrome/Chromium separately, matching the chromedriver\n# major version pinned in package.json.\n```\n\nIf the browser or driver is not detected, set both paths explicitly:\n\n```bash\nexport AXE_CHROME_PATH=\"$(command -v chromium)\"\nexport AXE_CHROMEDRIVER_PATH=\"$(command -v chromedriver)\"\n```\n\n## Run all automated checks\n\nFrom the skill root, serve the target application separately, then run:\n\n```bash\nbash scripts/a11y-audit.sh http://localhost:8000 ./a11y-reports\n```\n\nThe wrapper writes `axe_report.json`, `pa11y_report.json`,\n`qualweb_report.json`, and `w3c_source_html_report.json`. It resolves\nQualWeb's actual installed entry point instead of assuming a `qualweb`\nexecutable, uses axe's supported `--stdout` option, and validates fetched HTML\nwith the Nu checker.\n\n`w3c_source_html_report.json` only validates the raw HTTP response body\n(`scope: \"source-html\"` in the report). It does not see DOM mutations from\nJavaScript, authenticated routes, or other post-load states — those require\nthe browser-based tools (axe, Pa11y, QualWeb) run against each relevant state.\n\n## Read results\n\nTreat every `violations`, `incomplete`, `cantTell`, warning, and markup message\nas a review item. A clean automated report means only that the executed rules\nfound no violations; it does not establish WCAG conformance.\n\nFor AAA work, continue with the evidence matrix and manual protocol. For a\nproduction conformance claim, assess the complete set of pages and process\nsteps, including responsive variations and third-party content in scope.\n\nFile v2.0.10:skill-card.md\n\n## Description:\n\nBuild, audit, and repair web content against WCAG 2.2, including accessible HTML/CSS/JS creation, defect remediation, reproducible automated audits, WCAG 2.2 AAA evidence preparation, human-test records, and optional AI-WCAG-Gauntlet benchmark support.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[turbolego](https://clawhub.ai/user/turbolego)\n\n### License/Terms of Use:\n\nMIT\n\n## Use Case:\n\nDevelopers, engineers, and accessibility reviewers use this skill to build accessible web pages, audit reachable HTTP pages with automated tools, triage and fix WCAG 2.2 issues, and prepare AAA evidence and manual-test records when those claims are in scope.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill can run local accessibility audit tools, browser automation, curl, Java, and npm packages against chosen pages.\n\nMitigation: Install and run it only in environments where those local tools are acceptable, and scope audits to pages the user intends to test.\n\nRisk: Automated reports can be mistaken for complete WCAG conformance evidence.\n\nMitigation: Review generated reports manually, investigate incomplete or warning results, and complete the documented manual protocol and evidence matrix before making AAA or production conformance claims.\n\nRisk: The optional benchmark template could be reused as production content or as a benchmark submission.\n\nMitigation: Treat benchmark templates as reference material only and create original implementations for benchmark runs or production pages.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/turbolego/skills/wcag-skill)\n- [Project homepage](https://github.com/turbolego/wcag-skill)\n- [W3C WCAG 2.2 Quick Reference](https://www.w3.org/WAI/WCAG22/quickref/)\n- [Reproducible validator workflow](references/validator-workflow.md)\n- [WCAG 2.2 AAA evidence matrix](references/aaa-evidence-matrix.md)\n- [Mandatory human-test protocol](references/manual-test-protocol.md)\n- [Optional AI-WCAG-Gauntlet extension](benchmark/README.md)\n\n## Skill Output:\n\n**Output Type(s):** [guidance, markdown, code, shell commands, configuration]\n\n**Output Format:** [Markdown guidance with inline code and shell commands]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May produce local accessibility audit report files when the bundled scripts are run by the agent or user.]\n\n## Skill Version(s):\n\n2.0.10 (source: SKILL.md frontmatter and ClawHub release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v2.0.10:benchmark/resources/html_tags.json\n\n{\n  \"tags\": [\n    \"a\", \"abbr\", \"address\", \"area\", \"article\", \"aside\", \"audio\", \"b\", \"base\", \"bdi\", \"bdo\", \"blockquote\", \"body\", \"br\", \"button\", \"canvas\", \"caption\", \"cite\", \"code\", \"col\", \"colgroup\", \"data\", \"datalist\", \"dd\", \"del\", \"details\", \"dfn\", \"dialog\", \"div\", \"dl\", \"dt\", \"em\", \"embed\", \"fieldset\", \"figcaption\", \"figure\", \"footer\", \"form\", \"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\", \"head\", \"header\", \"hgroup\", \"hr\", \"html\", \"i\", \"iframe\", \"img\", \"input\", \"ins\", \"kbd\", \"label\", \"legend\", \"li\", \"link\", \"main\", \"map\", \"mark\", \"menu\", \"meta\", \"meter\", \"nav\", \"noscript\", \"object\", \"ol\", \"optgroup\", \"option\", \"output\", \"p\", \"picture\", \"pre\", \"progress\", \"q\", \"rp\", \"rt\", \"ruby\", \"s\", \"samp\", \"script\", \"search\", \"section\", \"select\", \"selectedcontent\", \"slot\", \"small\", \"source\", \"span\", \"strong\", \"style\", \"sub\", \"summary\", \"sup\", \"table\", \"tbody\", \"td\", \"template\", \"textarea\", \"tfoot\", \"th\", \"thead\", \"time\", \"title\", \"tr\", \"track\", \"u\", \"ul\", \"var\", \"video\", \"wbr\"\n  ]\n}\n\nFile v2.0.10:renovate.json\n\n{\n  \"$schema\": \"https://docs.renovatebot.com/renovate-schema.json\",\n  \"extends\": [\n    \"config:recommended\"\n  ]\n}\n\nFile v2.0.10:LICENSE\n\nMIT License\n\nCopyright (c) 2026 Tobias Andersen\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\nArchive v2.0.9: 20 files, 30912 bytes\n\nFiles: .clawhubignore (813b), benchmark/README.md (1059b), benchmark/references/ai-wcag-gauntlet-iteration-log.md (4850b), benchmark/references/checker-pitfalls.md (2526b), benchmark/resources/html_tags.json (975b), benchmark/scripts/check-tag-coverage.py (8790b), benchmark/templates/dummy.js (117b), benchmark/templates/index.html (14383b), benchmark/templates/style.css (998b), LICENSE (1072b), references/aaa-evidence-matrix.md (5644b), references/manual-test-protocol.md (3168b), references/validator-workflow.md (1967b), renovate.json (114b), scripts/a11y-audit-limited.sh (3672b), scripts/a11y-audit.sh (4424b), scripts/run-w3c-validator.mjs (1927b), skill-card.md (2887b), SKILL.md (6297b), _meta.json (129b)\n\nFile v2.0.9:SKILL.md\n\n---\nname: wcag-skill\ndescription: \"Build, audit, and repair web content against WCAG 2.2. Use when: (1) creating accessible HTML/CSS/JS, (2) remediating accessibility defects, (3) running reproducible automated audits, (4) preparing WCAG 2.2 AAA evidence and human-test records, or (5) running the optional AI-WCAG-Gauntlet benchmark.\"\nmetadata:\n  version: 2.0.9\n  openclaw:\n    requires:\n      bins:\n        - node\n        - npm\n        - python3\n        - curl\n        - java\n    envVars:\n      - name: AXE_CHROME_PATH\n        required: false\n        description: Explicit Chrome/Chromium binary path for scripts/a11y-audit.sh when auto-detection fails.\n      - name: AXE_CHROMEDRIVER_PATH\n        required: false\n        description: Explicit Chromedriver binary path for scripts/a11y-audit.sh when auto-detection fails.\n    install:\n      - kind: node\n        package: \"@axe-core/cli\"\n        bins: [axe]\n      - kind: node\n        package: pa11y\n        bins: [pa11y]\n      - kind: node\n        package: \"@qualweb/cli\"\n        bins: [qw]\n      - kind: node\n        package: vnu-jar\n        bins: [vnu]\n      - kind: node\n        package: chromedriver\n        bins: [chromedriver]\n    homepage: https://github.com/turbolego/wcag-skill\n---\n\n# WCAG 2.2 Accessibility\n\nUse this skill to build or audit web content. Prefer native HTML, test through\nHTTP, and treat automated output as evidence—not proof of conformance.\n\n## Choose the scope first\n\n1. Inventory every route, breakpoint, interactive state, overlay, error path,\n   media item, authentication step, and third-party component in scope.\n2. Set the target: `baseline`, `AA`, or `AAA`.\n3. For an AAA target, read **all three** references before implementation:\n   - [`references/validator-workflow.md`](references/validator-workflow.md)\n   - [`references/aaa-evidence-matrix.md`](references/aaa-evidence-matrix.md)\n   - [`references/manual-test-protocol.md`](references/manual-test-protocol.md)\n\n> Do not say “WCAG AAA compliant” from automated results. Level AAA requires\n> every applicable A, AA, and AAA success criterion for the full page and any\n> complete process. Record an explicit evidence row or non-applicability\n> rationale for each criterion.\n\n## Build accessible by default\n\n- Use one `<main>`, a meaningful `<title>`, one clear `<h1>`, and landmarks\n  only where their semantics help orientation. Use `<section>` for a meaningful\n  thematic grouping; give it an accessible heading when that improves its name.\n  Use `<div>` for visual grouping alone.\n- Use real `<a>`, `<button>`, `<input>`, `<select>`, `<textarea>`, and native\n  disclosure/dialog patterns before inventing ARIA widgets. Never put a\n  focusable element inside `aria-hidden=\"true\"` content.\n- Give informative images equivalent text; use `alt=\"\"` only for decorative\n  images. Provide the relevant captions, transcript, audio description, or\n  media alternative for media.\n- Label every form control, group related controls with `<fieldset><legend>`,\n  use appropriate input types and `autocomplete`, preserve entered data after\n  recoverable errors, and identify errors in text as well as colour.\n- Keep DOM order aligned with reading and Tab order. Provide a skip link,\n  visible focus, keyboard operation, and no keyboard trap.\n- Do not communicate status, errors, required fields, or instructions by colour,\n  position, shape, or sound alone. Respect `prefers-reduced-motion`.\n- Ensure pointer targets are at least 24×24 CSS px (AA) or 44×44 CSS px (AAA) unless an exception applies.\n- Ensure dragging movements can be operated with a single pointer without dragging (AA, unless dragging is essential) and provide alternatives or cancellation; timing limits on dragging are covered by separate timing criteria.\n- Make sure the keyboard focus indicator is visible and has sufficient contrast (AA, WCAG 2.2 SC 2.4.11 Focus Appearance: at least 2 CSS px perimeter and 3:1 contrast).\n\n## Use the right numeric target\n\n| Requirement | Baseline / AA minimum | AAA target |\n|---|---:|---:|\n| Normal text contrast | 4.5:1 | 7:1 |\n| Large text contrast | 3:1 | 4.5:1 |\n| UI component / focus contrast | 3:1 (AA; includes the 2.4.11 focus-appearance perimeter/contrast rule) | 3:1 |\n| Pointer target | 24×24 CSS px | 44×44 CSS px unless a documented exception applies |\n| Dragging movements | AA (WCAG 2.2) | AAA requires pointer target ≥44×44 CSS px and no time limits on dragging |\n\nFor AA (WCAG 2.2 SC 2.4.11 Focus Appearance), make the keyboard focus indicator\nat least as large as a two-CSS-pixel perimeter of the unfocused component and\ngive changed pixels at least 3:1 contrast. Ensure no part of a focused\ncomponent is obscured by author-created content.\n\n## Audit → triage → fix → verify\n\n\n1. Install the tools listed in the frontmatter and make Chrome/Chromium plus a\n   matching Chromedriver available. Set `AXE_CHROME_PATH` and\n   `AXE_CHROMEDRIVER_PATH` when auto-detection is insufficient.\n   In low-memory environments (e.g., <2GB RAM), consider using the headless\n   shell and limiting memory via `NODE_OPTIONS` and `ulimit -v`; see\n   `scripts/a11y-audit-limited.sh` for an example.\n\n2. Serve the site over HTTP. Run the reproducible wrapper in\n   [`references/validator-workflow.md`](references/validator-workflow.md).\n\n3. Triage structural and markup errors first, then semantic, visual, operable,\n   and understandable issues. Deduplicate findings across tools; retain raw\n   JSON reports.\n\n4. Fix one coherent group of issues, rerun the audit, and record the result.\n   Review every `incomplete`, `cantTell`, warning, and false-positive decision.\n\n5. For AAA, complete the mandatory manual protocol and evidence matrix before\n   any conformance statement.\n\n## Report precisely\n\nFor each finding, report the route/state, relevant success criterion, affected\nselector or component, user impact, exact change, validation method, and retest\nresult. Say “no automated findings” when that is all the tools establish.\n\n## Optional benchmark extension\n\nThe AI-WCAG-Gauntlet tag-coverage experiment is **not** a production\naccessibility gate. Use it only when the task explicitly requests benchmark\nscoring. Read [`benchmark/README.md`](benchmark/README.md) then; never copy its\nreference template into a benchmark submission.\n\nFile v2.0.9:benchmark/README.md\n\n# Optional AI-WCAG-Gauntlet extension\n\nThis directory supports the AI-WCAG-Gauntlet experiment. It is separate from\nthe production WCAG workflow because tag-count coverage is a benchmark\nconstraint, not evidence of WCAG conformance.\n\n## Use only for an explicit benchmark request\n\n1. Run the Gauntlet setup in its own repository to create a fresh submission\n   directory.\n2. Write original HTML, CSS, and scripts in that submission directory.\n3. Run the local pre-check from this extension:\n\n   ```bash\n   python3 benchmark/scripts/check-tag-coverage.py <submission-directory>/index.html\n   ```\n\n4. Run the Gauntlet test suite and retain its output separately from production\n   accessibility reports.\n\n## Integrity rule\n\n`benchmark/templates/` is reference material only. Do not copy a template or\nthe bare starter into a benchmark submission. A valid benchmark run must contain\nan original implementation tailored to its prompt.\n\nThe tag checker uses `benchmark/resources/html_tags.json` and no longer relies\non an absent root-level `resources/` directory.\n\nFile v2.0.9:_meta.json\n\n{\n  \"ownerId\": \"kn7fmyse3t502fgrgyjqg7q2c98bk706\",\n  \"slug\": \"wcag-skill\",\n  \"version\": \"2.0.9\",\n  \"publishedAt\": 1790169504948\n}\n\nFile v2.0.9:benchmark/references/ai-wcag-gauntlet-iteration-log.md\n\n# AI-WCAG-Gauntlet Iteration Log — DeepSeek V4 Pro (passing run, 6 iterations)\n\nReference for error strings, score progression, and fix history. Repo:\n`turbolego/AI-WCAG-Gauntlet` (private; clone with `gh repo clone turbolego/AI-WCAG-Gauntlet`\nor another scoped auth method — do not reference local credential files).\nModel under test: `deepseek-ai/deepseek-v4-pro` via nvidia provider, label \"Hermes\".\n\n## Score progression\n| Iter | Score  | HTML_TAG | W3C | AXE | Note |\n|------|--------|----------|-----|-----|------|\n| 1    | 12.50  | 107      | 0   | 2   | bare page, no `<main>` (landmark-one-main, region) |\n| 2    | 86.40  | 18       | 0   | 1   | added ~90 tags; target-size remains |\n| 3    | 12.50  | 0        | 43  | 1   | bad bulk rewrite → structural errors |\n| 4    | 96.80  | 0        | 4   | 1   | clean rewrite |\n| 5    | 98.80  | 0        | 2   | 1   | CSS not loading (base href) |\n| 6    | 168.18 | 0        | 0   | 0   | ✅ PASS |\n\n## Exact error strings seen\n- W3C: `Element \"selectedcontent\" not allowed as child of element \"select\" in this context.`\n- W3C: `End tag \"main\" seen, but there were open elements.` + `Unclosed element \"section\".`\n  (line points at the FIRST section, not the offending one)\n- W3C: `The element \"audio\" with the attribute \"controls\" must not appear as a descendant\n  of the \"a\" element.` (same for video/details/dialog/button/embed/iframe/label/input/\n  select/textarea)\n- W3C: `Stray end tag \"fieldset\".`\n- AXE: `target-size — All touch targets must be 24px large, or leave sufficient space`\n  → `Target has insufficient size (39.1px by 18px...)` and/or\n  `Safe clickable space has a diameter of 12px instead of at least 24px.`\n- AXE (iter 1): `landmark-one-main` + `region` — page had no `<main>`, h1 outside landmark.\n\n## Key fixes\n1. `<base href=\"/AI-WCAG-Gauntlet/\">` is injected into generated pages (matches GitHub\n   Pages deployment). Any RELATIVE `href`/`src` (style.css, scripts/dummy.js) resolves\n   against it → 404 at repo root → CSS never applied → axe target-size kept failing.\n   Fix: absolute URLs with %20 encoding:\n   `/AI-WCAG-Gauntlet/benchmarks/DeepSeek%20V4%20Pro/<folder>/style.css`.\n2. `<selectedcontent>` (new-ish HTML element, required by html_tags.json) fails W3C\n   inside `<select>` but passes inside a plain `<div>`. The tag checker only greps for\n   the literal string.\n3. target-size fix: `nav a { min-height: 24px; display: inline-block; padding: 4px 6px; margin: 2px; }`\n   (min-height is the critical part; inline style in `<head>` also works).\n4. Tag coverage: HTML comments are stripped by a custom scanner (see strip_comments()) before `TAG_RE = r\"<\\s*([a-zA-Z][a-zA-Z0-9\\-]*)\\b\"` via `re.findall`,\n   set-diff'd against `benchmark/resources/html_tags.json` (113 tags including\n   `selectedcontent`). The scanner tracks quote state only within tag context to\n   avoid false positives on attribute values containing `<!--`. Because comments\n   are stripped, commented tag literals do NOT count toward coverage —\n   always use a real element for required tags (e.g. <base target=\"_self\">\n       for base coverage and no URL rewrite).\n5. Keep `<section>` nesting closed — every open section needs its `</section>` before\n   `<main>` closes; nested sections must be explicitly terminated.\n\n## Environment notes (do not treat as permanent failures)\n- `npm ci` failed (lockfile out of sync) → `npm install` works.\n- Puppeteer engine wants Node ≥22.12, system had v20.20.0 → non-fatal.\n- Chrome for Testing installed via `npx -y puppeteer@24 browsers install chrome@stable`\n  at `~/.cache/puppeteer/chrome/linux-<ver>/chrome-linux64/chrome`; chromedriver v150\n  matched system Chrome 150.\n\n## Run 2 — fast-path template (2 iterations, SCORE 191.80) — INVALID RESULT\n- Used the known-good template from `templates/` instead of setup.sh's bare starter.\n  This is **reference material only** (see `benchmark/README.md`): copying it into a\n  benchmark submission measures no model behavior, so it is NOT a valid benchmark run.\n  Treat it strictly as a local smoke test of the validators, not a model score.\n- Iteration 1: full page with all 107/113 tags, proper landmarks, absolute CSS paths\n  → FAIL (scored 12.50 due to stale axe report from the starter page).\n- Iteration 2: PASS with 0 errors across all 5 validators, SCORE 191.80 (max).\n- Key insight: **the template is only a validator smoke-test shortcut** — it avoids\n  wasted iterations where the bare starter fails on 107 missing tags + 2 axe\n  violations, saving 4-5 iterations, but a real benchmark must still write original\n  markup tailored to its prompt.\n- New pitfall: `test-suite.sh` starts its own HTTP server — `curl` returning\n  exit 7 between runs just means the server is down, not a broken path. Don't manually\n  `curl` to verify the CSS URL during the run.\n\nFile v2.0.9:benchmark/references/checker-pitfalls.md\n\n# Checker Pitfalls\n\nEdge cases that trip up `check-tag-coverage.py` and tag-balance logic.\nAll cases are verified against `benchmark/resources/html_tags.json` (113 tags).\n\n## HTML comments do not count toward coverage\n\n`check_coverage` strips HTML comments (`<!-- ... -->`) before running\n`TAG_RE` against the document. A commented-out `<base>` literal does NOT\ncount as base coverage. **Always use a real element** for tags required by\n`benchmark/resources/html_tags.json` — a `<base target=\"_self\">` satisfies the tag requirement\nwithout rewriting relative URLs.\n\n## Optional-end-tag tracking is context-sensitive, not global\n\nA stray end tag for an optional-end-tag element (e.g. `</li>`, `</p>`,\n`</rp>`) is **always a parse error** unless that exact element was\nimplicitly closed earlier by an `AUTO_CLOSE_ON_OPEN` rule. Tracking by\ntag name alone causes false negatives: `<p>one<div>two</div><p>three</p></p>`\npasses because the second `</p>` sees `p` was \"previously\" implied-closed,\neven though no `<p>` is open at that point.\n\nCorrect approach: handle all implied closes in `handle_starttag` (pop from\nstack via AUTO_CLOSE_ON_OPEN). A tag not present in the stack at the time\nof `handle_endtag` has no valid open context and is always an error.\n\n## Void elements close open optional-end-tag elements\n\nPer HTML5 parsing, a void element (e.g. `<hr>`) implicitly closes a\npreceding open `<p>` (or other optional-end-tag element). The checker\nmust apply `AUTO_CLOSE_ON_OPEN` rules *before* the void-element early\nreturn in `handle_starttag`, or `<p>text<hr>` leaves an unclosed `<p>`.\n\n## Ruby optional end tags\n\n`<rt>` and `</rp>` have optional end tags in HTML5:\n- `</rt>` before another `<rt>` is legally omitted (self-closes the previous)\n- `</rp>` at end of ruby or before `<rt>` is legally omitted\n\nAdd `rt`/`rp` to `OPTIONAL_END_TAGS` and their close rules to\n`AUTO_CLOSE_ON_OPEN`.\n\n## Table header scope in tfoot\n\n`<tfoot>` row labels use `scope=\"row\"` (the label describes the row).\n`scope=\"col\"` associates the cell with a column instead. For a footer\nsummary row like \"Average\", `scope=\"row\"` is semantically correct.\n\n## Template <base> vs harness <base>\n\nThe AI-WCAG-Gauntlet harness injects `<base href=\"/AI-WCAG-Gauntlet/\">`\ninto benchmark pages. A benchmark template should NOT include its own\n`<base href=...>` (duplicate base elements cause the first to control\nrelative URLs). Use a bare `<base>` (no href) solely for tag-coverage\ncompliance, or rely on the harness-injected base for URL resolution.\n\nFile v2.0.9:references/aaa-evidence-matrix.md\n\n# WCAG 2.2 AAA evidence matrix\n\nUse this template only when the target is WCAG 2.2 AAA. AAA inherits every\napplicable A and AA criterion. Create a row for every applicable A/AA criterion\nfrom the [W3C Quick Reference](https://www.w3.org/WAI/WCAG22/quickref/) and for\nevery AAA criterion below. “Not applicable” must include a concise rationale.\n\n## Required record format\n\n| SC | Applicable? | Route, state, or asset | Evidence and validation method | Result | Residual risk |\n|---|---|---|---|---|---|\n| 1.4.6 | Yes | `/checkout`, all breakpoints | Measured all normal-text pairs at ≥7:1; visual review | Pass | None recorded |\n\nUse `Pass`, `Fail`, `Not applicable`, or `Needs human review`. Do not convert a\ntool warning into a pass without explaining the decision.\n\n## AAA success criteria\n\n| SC | Criterion | Applicability prompt and required evidence |\n|---|---|---|\n| 1.2.6 | Sign Language (Prerecorded) | If prerecorded synchronized media exists, document sign-language interpretation or the applicable exception. |\n| 1.2.7 | Extended Audio Description (Prerecorded) | If prerecorded video has pauses insufficient for description, document extended audio description. |\n| 1.2.8 | Media Alternative (Prerecorded) | If prerecorded synchronized media exists, document a complete media alternative. |\n| 1.2.9 | Audio-only (Live) | If live audio-only exists, document its equivalent alternative. |\n| 1.4.6 | Contrast (Enhanced) | Measure every normal-text pair at ≥7:1 and large-text pair at ≥4.5:1, including hover, focus, disabled, error, and overlay states. |\n| 1.4.7 | Low or No Background Audio | If prerecorded audio has speech, document the audio-control or background-audio exception. |\n| 1.4.8 | Visual Presentation | Check user-adjustable presentation requirements, including foreground/background choice, width, line spacing, and resize behaviour where applicable. |\n| 1.4.9 | Images of Text (No Exception) | Inventory images of text; replace with real text unless the specified exceptions apply. |\n| 2.1.3 | Keyboard (No Exception) | Keyboard-test every function and state; document any functionality that cannot be operated without a keyboard. |\n| 2.2.3 | No Timing | Document that time limits are absent or provide the applicable exception. |\n| 2.2.4 | Interruptions | Document that interruptions can be postponed or suppressed unless essential. |\n| 2.2.5 | Re-authenticating | Re-authenticate a representative session and show that user data is preserved. |\n| 2.2.6 | Timeouts | For inactivity timeouts that can lose data, document warning and preservation for more than 20 hours or the applicable exception. |\n| 2.3.2 | Three Flashes | Inspect all motion/video/ads; document that no content flashes more than three times in any one-second period. |\n| 2.3.3 | Animation from Interactions | Check interaction-triggered motion can be disabled unless essential. |\n| 2.4.8 | Location | For a multi-page set, identify the user’s current location through breadcrumbs, navigation, or another mechanism. |\n| 2.4.9 | Link Purpose (Link Only) | Review every link in isolation; its accessible name must identify purpose except for the criterion’s exceptions. |\n| 2.4.10 | Section Headings | Review long/complex content for descriptive section headings where headings organise content. |\n| 2.4.12 | Focus Not Obscured (Enhanced) | Tab through every breakpoint, overlay, sticky region, error state, and menu; no part of the focused component may be hidden by author content. |\n| 2.4.13 | Focus Appearance | Measure a focus indicator at least equal to a two-CSS-pixel perimeter of the component and ≥3:1 changed-pixel contrast. |\n| 2.5.5 | Target Size (Enhanced) | Measure pointer targets at ≥44×44 CSS px or document the specific exception. |\n| 2.5.6 | Concurrent Input Mechanisms | Confirm no author-created restriction disables a supported input mechanism. |\n| 3.1.3 | Unusual Words | Identify idioms, jargon, and specialised terms; provide a mechanism for definition when needed. |\n| 3.1.4 | Abbreviations | Identify abbreviations whose expanded form is needed for understanding; provide a mechanism for expansion. |\n| 3.1.5 | Reading Level | If primary content exceeds lower-secondary reading level, provide supplemental content or an alternative version at that level. |\n| 3.1.6 | Pronunciation | Where pronunciation is necessary to understand a word’s meaning, provide a mechanism for it. |\n| 3.2.5 | Change on Request | Confirm context changes occur only at user request or document the criterion exception. |\n| 3.3.5 | Help | Where context-sensitive help is available, provide it. |\n| 3.3.6 | Error Prevention (All) | For legal, financial, test, or data-changing submissions, demonstrate reversibility, review/correction, and confirmation. |\n| 3.3.9 | Accessible Authentication (Enhanced) | Test each authentication step; do not require a cognitive-function test unless an allowed alternative or mechanism is available. Do not rely on object recognition or personal content as the enhanced-level exception. |\n\n## Inherited WCAG 2.2 requirements to call out\n\nAAA also requires all applicable A and AA criteria. The AAA table above already\nincludes 2.4.12 Focus Not Obscured (Enhanced), 2.4.13 Focus Appearance, and\n3.3.9 Accessible Authentication (Enhanced) — do not duplicate rows for those.\nExplicitly verify the remaining WCAG 2.2 additions that are A/AA level: 2.4.11\nFocus Not Obscured (Minimum), 2.5.7 Dragging Movements, 2.5.8 Target Size\n(Minimum), 3.2.6 Consistent Help, 3.3.7 Redundant Entry, and 3.3.8 Accessible\nAuthentication (Minimum). Consult the W3C Quick Reference for the full\ninherited set.\n\nFile v2.0.9:references/manual-test-protocol.md\n\n# Mandatory human-test protocol\n\nComplete this protocol for every AAA audit and record the result in the evidence\nmatrix. Test every route, responsive variation, overlay, error path, and\nthird-party flow in scope. Mark a test not applicable only with a rationale.\n\n## Keyboard and focus\n\n1. Use only Tab, Shift+Tab, Enter, Space, Escape, arrow keys, and native\n   shortcuts where relevant. Reach and operate every function without a trap.\n2. Record the focus order through menus, modals, disclosures, custom widgets,\n   validation errors, and dynamically added content. Ensure it follows a\n   meaningful reading and operation order.\n3. At every breakpoint and scroll position, confirm focus is fully visible,\n   unobscured by sticky/overlay content, and meets the AAA focus-area and\n   contrast requirements.\n\n## Responsive and visual presentation\n\n1. Test text resize to 200%, then reflow at 320 CSS pixels or 400% browser zoom\n   without ordinary two-dimensional scrolling, clipping, overlap, or loss of\n   content/function.\n2. Apply the WCAG text-spacing override: line height 1.5, paragraph spacing 2,\n   letter spacing 0.12em, and word spacing 0.16em. Confirm content and controls\n   still work.\n3. Measure every rendered text/background pair and every interactive state.\n   Review text over images, transparency, gradients, charts, and canvases\n   separately; do not infer contrast from a parent background.\n\n## Motion, timing, and media\n\n1. Enable reduced motion and confirm non-essential motion stops or is reduced.\n2. Test time limits, interruption controls, reauthentication, and inactivity\n   timeouts with entered data. Verify the relevant AAA preservation rules.\n3. Review all video, audio, animation, and live media against the applicable\n   captions, description, transcript, sign-language, and media-alternative rows.\n4. Inspect flashing or rapidly changing content for seizure risk and provide a\n   pause/stop/hide mechanism for applicable moving content.\n\n## Forms, authentication, and understanding\n\n1. Trigger each validation error. Confirm the error is identified in text,\n   linked to the control where appropriate, preserves valid entries, and can be\n   corrected by keyboard and assistive technology.\n2. Test review, correction, confirmation, and reversal paths for submissions\n   involving legal commitments, financial transactions, tests, or data changes.\n3. Test every authentication step with password-manager paste, copy/paste, and\n   an alternative that avoids disallowed cognitive tests.\n4. Review help, labels, instructions, unusual words, abbreviations, reading\n   level, and pronunciation needs for the actual audience and task.\n\n## Assistive technology and reporting\n\nTest custom widgets, live regions, dialogs, dynamic errors, and complex controls\nwith at least one supported browser/screen-reader pair. Verify accessible names,\nroles, values, state changes, announcements, and return-focus behaviour. Record\nbrowser, assistive technology, version, date, tested route/state, and observed\nresult. Include disabled users in usability testing when possible; automated and\nfunctional checks alone do not establish real-world usability.\n\nFile v2.0.9:references/validator-workflow.md\n\n# Reproducible validator workflow\n\nUse this workflow after the page is reachable over HTTP. It intentionally uses\nwrapper scripts because package CLIs differ by version; do not copy obsolete\nflags from blog posts or old reports.\n\n## Prerequisites\n\nInstall the pinned Node tools from [`package.json`](../package.json) and a\nChromium-family browser plus matching Chromedriver. `vnu-jar` needs Java.\n\n```bash\nnpm ci\n# Install or provide Chrome/Chromium separately, matching the chromedriver\n# major version pinned in package.json.\n```\n\nIf the browser or driver is not detected, set both paths explicitly:\n\n```bash\nexport AXE_CHROME_PATH=\"$(command -v chromium)\"\nexport AXE_CHROMEDRIVER_PATH=\"$(command -v chromedriver)\"\n```\n\n## Run all automated checks\n\nFrom the skill root, serve the target application separately, then run:\n\n```bash\nbash scripts/a11y-audit.sh http://localhost:8000 ./a11y-reports\n```\n\nThe wrapper writes `axe_report.json`, `pa11y_report.json`,\n`qualweb_report.json`, and `w3c_source_html_report.json`. It resolves\nQualWeb's actual installed entry point instead of assuming a `qualweb`\nexecutable, uses axe's supported `--stdout` option, and validates fetched HTML\nwith the Nu checker.\n\n`w3c_source_html_report.json` only validates the raw HTTP response body\n(`scope: \"source-html\"` in the report). It does not see DOM mutations from\nJavaScript, authenticated routes, or other post-load states — those require\nthe browser-based tools (axe, Pa11y, QualWeb) run against each relevant state.\n\n## Read results\n\nTreat every `violations`, `incomplete`, `cantTell`, warning, and markup message\nas a review item. A clean automated report means only that the executed rules\nfound no violations; it does not establish WCAG conformance.\n\nFor AAA work, continue with the evidence matrix and manual protocol. For a\nproduction conformance claim, assess the complete set of pages and process\nsteps, including responsive variations and third-party content in scope.\n\nFile v2.0.9:skill-card.md\n\n## Description:\n\nBuild, audit, and repair web content against WCAG 2.2. Use when: (1) creating accessible HTML/CSS/JS, (2) remediating accessibility defects, (3) running reproducible automated audits, (4) preparing WCAG 2.2 AAA evidence and human-test records, or (5) running the optional AI-WCAG-Gauntlet benchmark.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[turbolego](https://clawhub.ai/user/turbolego)\n\n### License/Terms of Use:\n\nMIT\n\n## Use Case:\n\nDevelopers and engineers use this skill to build accessible web pages, remediate WCAG 2.2 issues, run reproducible accessibility audits, and prepare AA or AAA evidence records.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Automated accessibility tools can miss issues or return findings that require judgment, so tool output alone can overstate WCAG conformance.\n\nMitigation: Treat automated results as evidence, review incomplete or uncertain findings, and complete the manual protocol and evidence matrix before any AAA conformance statement.\n\nRisk: The audit workflow installs npm-based accessibility tooling and uses browser automation against target URLs.\n\nMitigation: Install only when comfortable with those dependencies, run scripts only against intended URLs and output directories, and retain generated reports locally.\n\nRisk: The optional AI-WCAG-Gauntlet benchmark is a benchmark constraint and not a production accessibility gate.\n\nMitigation: Use the benchmark extension only when explicitly requested and keep benchmark results separate from production WCAG evidence.\n\n## Reference(s):\n\n- [WCAG 2.2 Quick Reference](https://www.w3.org/WAI/WCAG22/quickref/)\n- [ClawHub skill page](https://clawhub.ai/turbolego/skills/wcag-skill)\n- [ClawDIS homepage](https://github.com/turbolego/wcag-skill)\n- [Validator Workflow](references/validator-workflow.md)\n- [WCAG 2.2 AAA Evidence Matrix](references/aaa-evidence-matrix.md)\n- [Mandatory Human-Test Protocol](references/manual-test-protocol.md)\n- [Optional AI-WCAG-Gauntlet Extension](benchmark/README.md)\n- [Checker Pitfalls](benchmark/references/checker-pitfalls.md)\n\n## Skill Output:\n\n**Output Type(s):** [guidance, markdown, code, shell commands, configuration]\n\n**Output Format:** [Markdown guidance with inline code, shell commands, and optional local audit report files]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Automated audit output is evidence only; WCAG conformance statements require human review and recorded validation.]\n\n## Skill Version(s):\n\n2.0.9 (source: frontmatter and server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v2.0.9:benchmark/resources/html_tags.json\n\n{\n  \"tags\": [\n    \"a\", \"abbr\", \"address\", \"area\", \"article\", \"aside\", \"audio\", \"b\", \"base\", \"bdi\", \"bdo\", \"blockquote\", \"body\", \"br\", \"button\", \"canvas\", \"caption\", \"cite\", \"code\", \"col\", \"colgroup\", \"data\", \"datalist\", \"dd\", \"del\", \"details\", \"dfn\", \"dialog\", \"div\", \"dl\", \"dt\", \"em\", \"embed\", \"fieldset\", \"figcaption\", \"figure\", \"footer\", \"form\", \"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\", \"head\", \"header\", \"hgroup\", \"hr\", \"html\", \"i\", \"iframe\", \"img\", \"input\", \"ins\", \"kbd\", \"label\", \"legend\", \"li\", \"link\", \"main\", \"map\", \"mark\", \"menu\", \"meta\", \"meter\", \"nav\", \"noscript\", \"object\", \"ol\", \"optgroup\", \"option\", \"output\", \"p\", \"picture\", \"pre\", \"progress\", \"q\", \"rp\", \"rt\", \"ruby\", \"s\", \"samp\", \"script\", \"search\", \"section\", \"select\", \"selectedcontent\", \"slot\", \"small\", \"source\", \"span\", \"strong\", \"style\", \"sub\", \"summary\", \"sup\", \"table\", \"tbody\", \"td\", \"template\", \"textarea\", \"tfoot\", \"th\", \"thead\", \"time\", \"title\", \"tr\", \"track\", \"u\", \"ul\", \"var\", \"video\", \"wbr\"\n  ]\n}\n\nFile v2.0.9:renovate.json\n\n{\n  \"$schema\": \"https://docs.renovatebot.com/renovate-schema.json\",\n  \"extends\": [\n    \"config:recommended\"\n  ]\n}\n\nFile v2.0.9:LICENSE\n\nMIT License\n\nCopyright (c) 2026 Tobias Andersen\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\nArchive v2.0.8: 20 files, 30884 bytes\n\nFiles: .clawhubignore (813b), benchmark/README.md (1059b), benchmark/references/ai-wcag-gauntlet-iteration-log.md (4850b), benchmark/references/checker-pitfalls.md (2526b), benchmark/resources/html_tags.json (975b), benchmark/scripts/check-tag-coverage.py (8790b), benchmark/templates/dummy.js (117b), benchmark/templates/index.html (14383b), benchmark/templates/style.css (998b), LICENSE (1072b), references/aaa-evidence-matrix.md (5644b), references/manual-test-protocol.md (3168b), references/validator-workflow.md (1967b), renovate.json (114b), scripts/a11y-audit-limited.sh (3672b), scripts/a11y-audit.sh (4424b), scripts/run-w3c-validator.mjs (1927b), skill-card.md (2794b), SKILL.md (6297b), _meta.json (129b)\n\nFile v2.0.8:SKILL.md\n\n---\nname: wcag-skill\ndescription: \"Build, audit, and repair web content against WCAG 2.2. Use when: (1) creating accessible HTML/CSS/JS, (2) remediating accessibility defects, (3) running reproducible automated audits, (4) preparing WCAG 2.2 AAA evidence and human-test records, or (5) running the optional AI-WCAG-Gauntlet benchmark.\"\nmetadata:\n  version: 2.0.8\n  openclaw:\n    requires:\n      bins:\n        - node\n        - npm\n        - python3\n        - curl\n        - java\n    envVars:\n      - name: AXE_CHROME_PATH\n        required: false\n        description: Explicit Chrome/Chromium binary path for scripts/a11y-audit.sh when auto-detection fails.\n      - name: AXE_CHROMEDRIVER_PATH\n        required: false\n        description: Explicit Chromedriver binary path for scripts/a11y-audit.sh when auto-detection fails.\n    install:\n      - kind: node\n        package: \"@axe-core/cli\"\n        bins: [axe]\n      - kind: node\n        package: pa11y\n        bins: [pa11y]\n      - kind: node\n        package: \"@qualweb/cli\"\n        bins: [qw]\n      - kind: node\n        package: vnu-jar\n        bins: [vnu]\n      - kind: node\n        package: chromedriver\n        bins: [chromedriver]\n    homepage: https://github.com/turbolego/wcag-skill\n---\n\n# WCAG 2.2 Accessibility\n\nUse this skill to build or audit web content. Prefer native HTML, test through\nHTTP, and treat automated output as evidence—not proof of conformance.\n\n## Choose the scope first\n\n1. Inventory every route, breakpoint, interactive state, overlay, error path,\n   media item, authentication step, and third-party component in scope.\n2. Set the target: `baseline`, `AA`, or `AAA`.\n3. For an AAA target, read **all three** references before implementation:\n   - [`references/validator-workflow.md`](references/validator-workflow.md)\n   - [`references/aaa-evidence-matrix.md`](references/aaa-evidence-matrix.md)\n   - [`references/manual-test-protocol.md`](references/manual-test-protocol.md)\n\n> Do not say “WCAG AAA compliant” from automated results. Level AAA requires\n> every applicable A, AA, and AAA success criterion for the full page and any\n> complete process. Record an explicit evidence row or non-applicability\n> rationale for each criterion.\n\n## Build accessible by default\n\n- Use one `<main>`, a meaningful `<title>`, one clear `<h1>`, and landmarks\n  only where their semantics help orientation. Use `<section>` for a meaningful\n  thematic grouping; give it an accessible heading when that improves its name.\n  Use `<div>` for visual grouping alone.\n- Use real `<a>`, `<button>`, `<input>`, `<select>`, `<textarea>`, and native\n  disclosure/dialog patterns before inventing ARIA widgets. Never put a\n  focusable element inside `aria-hidden=\"true\"` content.\n- Give informative images equivalent text; use `alt=\"\"` only for decorative\n  images. Provide the relevant captions, transcript, audio description, or\n  media alternative for media.\n- Label every form control, group related controls with `<fieldset><legend>`,\n  use appropriate input types and `autocomplete`, preserve entered data after\n  recoverable errors, and identify errors in text as well as colour.\n- Keep DOM order aligned with reading and Tab order. Provide a skip link,\n  visible focus, keyboard operation, and no keyboard trap.\n- Do not communicate status, errors, required fields, or instructions by colour,\n  position, shape, or sound alone. Respect `prefers-reduced-motion`.\n- Ensure pointer targets are at least 24×24 CSS px (AA) or 44×44 CSS px (AAA) unless an exception applies.\n- Ensure dragging movements can be operated with a single pointer without dragging (AA, unless dragging is essential) and provide alternatives or cancellation; timing limits on dragging are covered by separate timing criteria.\n- Make sure the keyboard focus indicator is visible and has sufficient contrast (AA, WCAG 2.2 SC 2.4.11 Focus Appearance: at least 2 CSS px perimeter and 3:1 contrast).\n\n## Use the right numeric target\n\n| Requirement | Baseline / AA minimum | AAA target |\n|---|---:|---:|\n| Normal text contrast | 4.5:1 | 7:1 |\n| Large text contrast | 3:1 | 4.5:1 |\n| UI component / focus contrast | 3:1 (AA; includes the 2.4.11 focus-appearance perimeter/contrast rule) | 3:1 |\n| Pointer target | 24×24 CSS px | 44×44 CSS px unless a documented exception applies |\n| Dragging movements | AA (WCAG 2.2) | AAA requires pointer target ≥44×44 CSS px and no time limits on dragging |\n\nFor AA (WCAG 2.2 SC 2.4.11 Focus Appearance), make the keyboard focus indicator\nat least as large as a two-CSS-pixel perimeter of the unfocused component and\ngive changed pixels at least 3:1 contrast. Ensure no part of a focused\ncomponent is obscured by author-created content.\n\n## Audit → triage → fix → verify\n\n\n1. Install the tools listed in the frontmatter and make Chrome/Chromium plus a\n   matching Chromedriver available. Set `AXE_CHROME_PATH` and\n   `AXE_CHROMEDRIVER_PATH` when auto-detection is insufficient.\n   In low-memory environments (e.g., <2GB RAM), consider using the headless\n   shell and limiting memory via `NODE_OPTIONS` and `ulimit -v`; see\n   `scripts/a11y-audit-limited.sh` for an example.\n\n2. Serve the site over HTTP. Run the reproducible wrapper in\n   [`references/validator-workflow.md`](references/validator-workflow.md).\n\n3. Triage structural and markup errors first, then semantic, visual, operable,\n   and understandable issues. Deduplicate findings across tools; retain raw\n   JSON reports.\n\n4. Fix one coherent group of issues, rerun the audit, and record the result.\n   Review every `incomplete`, `cantTell`, warning, and false-positive decision.\n\n5. For AAA, complete the mandatory manual protocol and evidence matrix before\n   any conformance statement.\n\n## Report precisely\n\nFor each finding, report the route/state, relevant success criterion, affected\nselector or component, user impact, exact change, validation method, and retest\nresult. Say “no automated findings” when that is all the tools establish.\n\n## Optional benchmark extension\n\nThe AI-WCAG-Gauntlet tag-coverage experiment is **not** a production\naccessibility gate. Use it only when the task explicitly requests benchmark\nscoring. Read [`benchmark/README.md`](benchmark/README.md) then; never copy its\nreference template into a benchmark submission.\n\nFile v2.0.8:benchmark/README.md\n\n# Optional AI-WCAG-Gauntlet extension\n\nThis directory supports the AI-WCAG-Gauntlet experiment. It is separate from\nthe production WCAG workflow because tag-count coverage is a benchmark\nconstraint, not evidence of WCAG conformance.\n\n## Use only for an explicit benchmark request\n\n1. Run the Gauntlet setup in its own repository to create a fresh submission\n   directory.\n2. Write original HTML, CSS, and scripts in that submission directory.\n3. Run the local pre-check from this extension:\n\n   ```bash\n   python3 benchmark/scripts/check-tag-coverage.py <submission-directory>/index.html\n   ```\n\n4. Run the Gauntlet test suite and retain its output separately from production\n   accessibility reports.\n\n## Integrity rule\n\n`benchmark/templates/` is reference material only. Do not copy a template or\nthe bare starter into a benchmark submission. A valid benchmark run must contain\nan original implementation tailored to its prompt.\n\nThe tag checker uses `benchmark/resources/html_tags.json` and no longer relies\non an absent root-level `resources/` directory.\n\nFile v2.0.8:_meta.json\n\n{\n  \"ownerId\": \"kn7fmyse3t502fgrgyjqg7q2c98bk706\",\n  \"slug\": \"wcag-skill\",\n  \"version\": \"2.0.8\",\n  \"publishedAt\": 1790169067496\n}\n\nFile v2.0.8:benchmark/references/ai-wcag-gauntlet-iteration-log.md\n\n# AI-WCAG-Gauntlet Iteration Log — DeepSeek V4 Pro (passing run, 6 iterations)\n\nReference for error strings, score progression, and fix history. Repo:\n`turbolego/AI-WCAG-Gauntlet` (private; clone with `gh repo clone turbolego/AI-WCAG-Gauntlet`\nor another scoped auth method — do not reference local credential files).\nModel under test: `deepseek-ai/deepseek-v4-pro` via nvidia provider, label \"Hermes\".\n\n## Score progression\n| Iter | Score  | HTML_TAG | W3C | AXE | Note |\n|------|--------|----------|-----|-----|------|\n| 1    | 12.50  | 107      | 0   | 2   | bare page, no `<main>` (landmark-one-main, region) |\n| 2    | 86.40  | 18       | 0   | 1   | added ~90 tags; target-size remains |\n| 3    | 12.50  | 0        | 43  | 1   | bad bulk rewrite → structural errors |\n| 4    | 96.80  | 0        | 4   | 1   | clean rewrite |\n| 5    | 98.80  | 0        | 2   | 1   | CSS not loading (base href) |\n| 6    | 168.18 | 0        | 0   | 0   | ✅ PASS |\n\n## Exact error strings seen\n- W3C: `Element \"selectedcontent\" not allowed as child of element \"select\" in this context.`\n- W3C: `End tag \"main\" seen, but there were open elements.` + `Unclosed element \"section\".`\n  (line points at the FIRST section, not the offending one)\n- W3C: `The element \"audio\" with the attribute \"controls\" must not appear as a descendant\n  of the \"a\" element.` (same for video/details/dialog/button/embed/iframe/label/input/\n  select/textarea)\n- W3C: `Stray end tag \"fieldset\".`\n- AXE: `target-size — All touch targets must be 24px large, or leave sufficient space`\n  → `Target has insufficient size (39.1px by 18px...)` and/or\n  `Safe clickable space has a diameter of 12px instead of at least 24px.`\n- AXE (iter 1): `landmark-one-main` + `region` — page had no `<main>`, h1 outside landmark.\n\n## Key fixes\n1. `<base href=\"/AI-WCAG-Gauntlet/\">` is injected into generated pages (matches GitHub\n   Pages deployment). Any RELATIVE `href`/`src` (style.css, scripts/dummy.js) resolves\n   against it → 404 at repo root → CSS never applied → axe target-size kept failing.\n   Fix: absolute URLs with %20 encoding:\n   `/AI-WCAG-Gauntlet/benchmarks/DeepSeek%20V4%20Pro/<folder>/style.css`.\n2. `<selectedcontent>` (new-ish HTML element, required by html_tags.json) fails W3C\n   inside `<select>` but passes inside a plain `<div>`. The tag checker only greps for\n   the literal string.\n3. target-size fix: `nav a { min-height: 24px; display: inline-block; padding: 4px 6px; margin: 2px; }`\n   (min-height is the critical part; inline style in `<head>` also works).\n4. Tag coverage: HTML comments are stripped by a custom scanner (see strip_comments()) before `TAG_RE = r\"<\\s*([a-zA-Z][a-zA-Z0-9\\-]*)\\b\"` via `re.findall`,\n   set-diff'd against `benchmark/resources/html_tags.json` (113 tags including\n   `selectedcontent`). The scanner tracks quote state only within tag context to\n   avoid false positives on attribute values containing `<!--`. Because comments\n   are stripped, commented tag literals do NOT count toward coverage —\n   always use a real element for r\n\nArchive v2.0.7: 20 files, 30885 bytes\n\nFiles: .clawhubignore (813b), benchmark/README.md (1059b), benchmark/references/ai-wcag-gauntlet-iteration-log.md (4850b), benchmark/references/checker-pitfalls.md (2526b), benchmark/resources/html_tags.json (975b), benchmark/scripts/check-tag-coverage.py (8790b), benchmark/templates/dummy.js (117b), benchmark/templates/index.html (14383b), benchmark/templates/style.css (998b), LICENSE (1072b), references/aaa-evidence-matrix.md (5644b), references/manual-test-protocol.md (3168b), references/validator-workflow.md (1967b), renovate.json (114b), scripts/a11y-audit-limited.sh (3672b), scripts/a11y-audit.sh (4424b), scripts/run-w3c-validator.mjs (1927b), skill-card.md (2743b), SKILL.md (6297b), _meta.json (129b)\n\nArchive v2.0.6: 19 files, 29078 bytes\n\nFiles: .clawhubignore (813b), benchmark/README.md (1059b), benchmark/references/ai-wcag-gauntlet-iteration-log.md (4850b), benchmark/references/checker-pitfalls.md (2526b), benchmark/resources/html_tags.json (975b), benchmark/scripts/check-tag-coverage.py (8790b), benchmark/templates/dummy.js (117b), benchmark/templates/index.html (14383b), benchmark/templates/style.css (998b), LICENSE (1072b), references/aaa-evidence-matrix.md (5644b), references/manual-test-protocol.md (3168b), references/validator-workflow.md (1967b), renovate.json (114b), scripts/a11y-audit.sh (4424b), scripts/run-w3c-validator.mjs (1927b), skill-card.md (2742b), SKILL.md (5395b), _meta.json (129b)\n\nArchive v2.0.4: 16 files, 26587 bytes\n\nFiles: benchmark/references/ai-wcag-gauntlet-iteration-log.md (4850b), benchmark/references/checker-pitfalls.md (2526b), benchmark/resources/html_tags.json (975b), benchmark/scripts/check-tag-coverage.py (8790b), benchmark/templates/dummy.js (117b), benchmark/templates/index.html (14383b), benchmark/templates/style.css (998b), LICENSE (1072b), references/aaa-evidence-matrix.md (5644b), references/manual-test-protocol.md (3168b), references/validator-workflow.md (1967b), scripts/a11y-audit.sh (2416b), scripts/run-w3c-validator.mjs (1656b), skill-card.md (2814b), SKILL.md (5395b), _meta.json (129b)\n\nArchive v2.0.3: 17 files, 24642 bytes\n\nFiles: .clawhubignore (675b), benchmark/README.md (1059b), benchmark/references/ai-wcag-gauntlet-iteration-log.md (4085b), benchmark/resources/html_tags.json (975b), benchmark/scripts/check-tag-coverage.py (5157b), benchmark/templates/dummy.js (117b), benchmark/templates/index.html (14564b), benchmark/templates/style.css (998b), LICENSE (1072b), references/aaa-evidence-matrix.md (5644b), references/manual-test-protocol.md (3168b), references/validator-workflow.md (1967b), scripts/a11y-audit.sh (2416b), scripts/run-w3c-validator.mjs (1656b), skill-card.md (2549b), SKILL.md (5395b), _meta.json (129b)\n\nArchive v2.0.1: 18 files, 62239 bytes\n\nFiles: benchmark/references/ai-wcag-gauntlet-iteration-log.md (4085b), benchmark/resources/html_tags.json (975b), benchmark/scripts/check-tag-coverage.py (5157b), benchmark/templates/dummy.js (117b), benchmark/templates/index.html (14564b), benchmark/templates/style.css (998b), LICENSE (1072b), package-lock.json (136066b), package.json (422b), references/aaa-evidence-matrix.md (5644b), references/manual-test-protocol.md (3168b), references/validator-workflow.md (1967b), scripts/a11y-audit.sh (2416b), scripts/publish-web.py (7085b), scripts/run-w3c-validator.mjs (1656b), skill-card.md (2578b), SKILL.md (5049b), _meta.json (129b)","readmeExcerpt":"Skill: WCAG Accessibility — Testing, Fixing, and Building Accessible Pages Owner: turbolego Summary: Build, audit, and repair web content against WCAG 2.2. Use when: (1) creating accessible HTML/CSS/JS, (2) remediating accessibility defects, (3) running reproducible automated audits, (4) preparing WCAG 2.2 AAA evidence and human-test records, or (5) running the optional AI-WCAG-Gauntlet benchmark. Tags: accessibility","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"python3 benchmark/scripts/check-tag-coverage.py <submission-directory>/index.html"},{"language":"bash","snippet":"npm ci\n# Install or provide Chrome/Chromium separately, matching the chromedriver\n# major version pinned in package.json."},{"language":"bash","snippet":"export AXE_CHROME_PATH=\"$(command -v chromium)\"\nexport AXE_CHROMEDRIVER_PATH=\"$(command -v chromedriver)\""},{"language":"bash","snippet":"bash scripts/a11y-audit.sh http://localhost:8000 ./a11y-reports"},{"language":"bash","snippet":"python3 benchmark/scripts/check-tag-coverage.py <submission-directory>/index.html"},{"language":"bash","snippet":"npm ci\n# Install or provide Chrome/Chromium separately, matching the chromedriver\n# major version pinned in package.json."}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: wcag-skill\ndescription: \"Build, audit, and repair web content against WCAG 2.2. Use when: (1) creating accessible HTML/CSS/JS, (2) remediating accessibility defects, (3) running reproducible automated audits, (4) preparing WCAG 2.2 AAA evidence and human-test records, or (5) running the optional AI-WCAG-Gauntlet benchmark.\"\nmetadata:\n  version: 2.0.12\n  openclaw:\n    requires:\n      bins:\n        - node\n        - npm\n        - python3\n        - curl\n        - java\n    envVars:\n      - name: AXE_CHROME_PATH\n        required: false\n        description: Explicit Chrome/Chromium binary path for scripts/a11y-audit.sh when auto-detection fails.\n      - name: AXE_CHROMEDRIVER_PATH\n        required: false\n        description: Explicit Chromedriver binary path for scripts/a11y-audit.sh when auto-detection fails.\n    install:\n      - kind: node\n        package: \"@axe-core/cli\"\n        bins: [axe]\n      - kind: node\n        package: pa11y\n        bins: [pa11y]\n      - kind: node\n        package: \"@qualweb/cli\"\n        bins: [qw]\n      - kind: node\n        package: vnu-jar\n        bins: [vnu]\n      - kind: node\n        package: chromedriver\n        bins: [chromedriver]\n    homepage: https://github.com/turbolego/wcag-skill\n---\n\n# WCAG 2.2 Accessibility\n\nUse this skill to build or audit web content. Prefer native HTML, test through\nHTTP, and treat automated output as evidence—not proof of conformance.\n\n## Choose the scope first\n\n1. Inventory every route, breakpoint, interactive state, overlay, error path,\n   media item, authentication step, and third-party component in scope.\n2. Set the target: `baseline`, `AA`, or `AAA`.\n3. For an AAA target, read **all three** references before implementation:\n   - [`references/validator-workflow.md`](references/validator-workflow.md)\n   - [`references/aaa-evidence-matrix.md`](references/aaa-evidence-matrix.md)\n   - [`references/manual-test-protocol.md`](references/manual-test-protocol.md)\n\n> Do not say “WCAG AAA compliant” from automated results. Level AAA requires\n> every applicable A, AA, and AAA success criterion for the full page and any\n> complete process. Record an explicit evidence row or non-applicability\n> rationale for each criterion.\n\n## Build accessible by default\n\n- Use one `<main>`, a meaningful `<title>`, one clear `<h1>`, and landmarks\n  only where their semantics help orientation. Use `<section>` for a meaningful\n  thematic grouping; give it an accessible heading when that improves its name.\n  Use `<div>` for visual grouping alone.\n- Use real `<a>`, `<button>`, `<input>`, `<select>`, `<textarea>`, and native\n  disclosure/dialog patterns before inventing ARIA widgets. Never put a\n  focusable element inside `aria-hidden=\"true\"` content.\n- Give informative images equivalent text; use `alt=\"\"` only for decorative\n  images. Provide the relevant captions, transcript, audio description, or\n  media alternative for media.\n- Label every form control, group related controls with `<fieldset><legend>`,\n  use a"},{"path":"benchmark/README.md","content":"# Optional AI-WCAG-Gauntlet extension\n\nThis directory supports the AI-WCAG-Gauntlet experiment. It is separate from\nthe production WCAG workflow because tag-count coverage is a benchmark\nconstraint, not evidence of WCAG conformance.\n\n## Use only for an explicit benchmark request\n\n1. Run the Gauntlet setup in its own repository to create a fresh submission\n   directory.\n2. Write original HTML, CSS, and scripts in that submission directory.\n3. Run the local pre-check from this extension:\n\n   ```bash\n   python3 benchmark/scripts/check-tag-coverage.py <submission-directory>/index.html\n   ```\n\n4. Run the Gauntlet test suite and retain its output separately from production\n   accessibility reports.\n\n## Integrity rule\n\n`benchmark/templates/` is reference material only. Do not copy a template or\nthe bare starter into a benchmark submission. A valid benchmark run must contain\nan original implementation tailored to its prompt.\n\nThe tag checker uses `benchmark/resources/html_tags.json` and no longer relies\non an absent root-level `resources/` directory."},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7fmyse3t502fgrgyjqg7q2c98bk706\",\n  \"slug\": \"wcag-skill\",\n  \"version\": \"2.0.12\",\n  \"publishedAt\": 1790237018815\n}"},{"path":"benchmark/references/ai-wcag-gauntlet-iteration-log.md","content":"# AI-WCAG-Gauntlet Iteration Log — DeepSeek V4 Pro (passing run, 6 iterations)\n\nReference for error strings, score progression, and fix history. Repo:\n`turbolego/AI-WCAG-Gauntlet` (private; clone with `gh repo clone turbolego/AI-WCAG-Gauntlet`\nor another scoped auth method — do not reference local credential files).\nModel under test: `deepseek-ai/deepseek-v4-pro` via nvidia provider, label \"Hermes\".\n\n## Score progression\n| Iter | Score  | HTML_TAG | W3C | AXE | Note |\n|------|--------|----------|-----|-----|------|\n| 1    | 12.50  | 107      | 0   | 2   | bare page, no `<main>` (landmark-one-main, region) |\n| 2    | 86.40  | 18       | 0   | 1   | added ~90 tags; target-size remains |\n| 3    | 12.50  | 0        | 43  | 1   | bad bulk rewrite → structural errors |\n| 4    | 96.80  | 0        | 4   | 1   | clean rewrite |\n| 5    | 98.80  | 0        | 2   | 1   | CSS not loading (base href) |\n| 6    | 168.18 | 0        | 0   | 0   | ✅ PASS |\n\n## Exact error strings seen\n- W3C: `Element \"selectedcontent\" not allowed as child of element \"select\" in this context.`\n- W3C: `End tag \"main\" seen, but there were open elements.` + `Unclosed element \"section\".`\n  (line points at the FIRST section, not the offending one)\n- W3C: `The element \"audio\" with the attribute \"controls\" must not appear as a descendant\n  of the \"a\" element.` (same for video/details/dialog/button/embed/iframe/label/input/\n  select/textarea)\n- W3C: `Stray end tag \"fieldset\".`\n- AXE: `target-size — All touch targets must be 24px large, or leave sufficient space`\n  → `Target has insufficient size (39.1px by 18px...)` and/or\n  `Safe clickable space has a diameter of 12px instead of at least 24px.`\n- AXE (iter 1): `landmark-one-main` + `region` — page had no `<main>`, h1 outside landmark.\n\n## Key fixes\n1. `<base href=\"/AI-WCAG-Gauntlet/\">` is injected into generated pages (matches GitHub\n   Pages deployment). Any RELATIVE `href`/`src` (style.css, scripts/dummy.js) resolves\n   against it → 404 at repo root → CSS never applied → axe target-size kept failing.\n   Fix: absolute URLs with %20 encoding:\n   `/AI-WCAG-Gauntlet/benchmarks/DeepSeek%20V4%20Pro/<folder>/style.css`.\n2. `<selectedcontent>` (new-ish HTML element, required by html_tags.json) fails W3C\n   inside `<select>` but passes inside a plain `<div>`. The tag checker only greps for\n   the literal string.\n3. target-size fix: `nav a { min-height: 24px; display: inline-block; padding: 4px 6px; margin: 2px; }`\n   (min-height is the critical part; inline style in `<head>` also works).\n4. Tag coverage: HTML comments are stripped by a custom scanner (see strip_comments()) before `TAG_RE = r\"<\\s*([a-zA-Z][a-zA-Z0-9\\-]*)\\b\"` via `re.findall`,\n   set-diff'd against `benchmark/resources/html_tags.json` (113 tags including\n   `selectedcontent`). The scanner tracks quote state only within tag context to\n   avoid false positives on attribute values containing `<!--`. Because comments\n   are stripped, commented tag literals do NOT count toward coverage "},{"path":"benchmark/references/checker-pitfalls.md","content":"# Checker Pitfalls\n\nEdge cases that trip up `check-tag-coverage.py` and tag-balance logic.\nAll cases are verified against `benchmark/resources/html_tags.json` (113 tags).\n\n## HTML comments do not count toward coverage\n\n`check_coverage` strips HTML comments (`<!-- ... -->`) before running\n`TAG_RE` against the document. A commented-out `<base>` literal does NOT\ncount as base coverage. **Always use a real element** for tags required by\n`benchmark/resources/html_tags.json` — a `<base target=\"_self\">` satisfies the tag requirement\nwithout rewriting relative URLs.\n\n## Optional-end-tag tracking is context-sensitive, not global\n\nA stray end tag for an optional-end-tag element (e.g. `</li>`, `</p>`,\n`</rp>`) is **always a parse error** unless that exact element was\nimplicitly closed earlier by an `AUTO_CLOSE_ON_OPEN` rule. Tracking by\ntag name alone causes false negatives: `<p>one<div>two</div><p>three</p></p>`\npasses because the second `</p>` sees `p` was \"previously\" implied-closed,\neven though no `<p>` is open at that point.\n\nCorrect approach: handle all implied closes in `handle_starttag` (pop from\nstack via AUTO_CLOSE_ON_OPEN). A tag not present in the stack at the time\nof `handle_endtag` has no valid open context and is always an error.\n\n## Void elements close open optional-end-tag elements\n\nPer HTML5 parsing, a void element (e.g. `<hr>`) implicitly closes a\npreceding open `<p>` (or other optional-end-tag element). The checker\nmust apply `AUTO_CLOSE_ON_OPEN` rules *before* the void-element early\nreturn in `handle_starttag`, or `<p>text<hr>` leaves an unclosed `<p>`.\n\n## Ruby optional end tags\n\n`<rt>` and `</rp>` have optional end tags in HTML5:\n- `</rt>` before another `<rt>` is legally omitted (self-closes the previous)\n- `</rp>` at end of ruby or before `<rt>` is legally omitted\n\nAdd `rt`/`rp` to `OPTIONAL_END_TAGS` and their close rules to\n`AUTO_CLOSE_ON_OPEN`.\n\n## Table header scope in tfoot\n\n`<tfoot>` row labels use `scope=\"row\"` (the label describes the row).\n`scope=\"col\"` associates the cell with a column instead. For a footer\nsummary row like \"Average\", `scope=\"row\"` is semantically correct.\n\n## Template <base> vs harness <base>\n\nThe AI-WCAG-Gauntlet harness injects `<base href=\"/AI-WCAG-Gauntlet/\">`\ninto benchmark pages. A benchmark template should NOT include its own\n`<base href=...>` (duplicate base elements cause the first to control\nrelative URLs). Use a bare `<base>` (no href) solely for tag-coverage\ncompliance, or rely on the harness-injected base for URL resolution."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":null,"editorialQuality":{"score":100,"threshold":65,"status":"thin","wordCount":2060,"uniquenessScore":44,"reasons":["uniqueness-below-45"]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-10T22:26:14.168Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-10T22:26:14.168Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-11T00:33:09.138Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}