{
  "corpus": "a11y.world agent test corpus",
  "version": "0.1.0",
  "updated": "2026-10-02",
  "license": "CC0-1.0",
  "rules": "https://a11y.world/agents/rules.json",
  "how_to_score": "For each page, run your checks and produce findings with rule and selector. A finding matches an expected one when the rule id is equal and the selectors resolve to the same element (or the same CSS rule for stylesheet findings). Precision = matched / reported. Recall = matched / expected. Page 14 is a control: any finding there is a false positive.",
  "pages": [
    {
      "page": "01-missing-alt.html",
      "url": "https://a11y.world/agents/test-corpus/01-missing-alt.html",
      "expected": [
        {
          "rule": "AW-ALT-001",
          "selector": "#img-1",
          "severity": "blocker",
          "note": "No alt attribute; a screen reader announces the file name."
        },
        {
          "rule": "AW-ALT-003",
          "selector": "#img-2",
          "severity": "major",
          "note": "Alt is the file name."
        }
      ]
    },
    {
      "page": "02-alt-prefix.html",
      "url": "https://a11y.world/agents/test-corpus/02-alt-prefix.html",
      "expected": [
        {
          "rule": "AW-ALT-002",
          "selector": "#img-1",
          "severity": "minor",
          "note": "Alt starts with 'Image of'."
        },
        {
          "rule": "AW-ALT-005",
          "selector": "#img-2",
          "severity": "minor",
          "note": "Alt duplicates the adjacent heading verbatim; use alt=\"\" or add what the image contributes."
        }
      ]
    },
    {
      "page": "03-linked-image.html",
      "url": "https://a11y.world/agents/test-corpus/03-linked-image.html",
      "expected": [
        {
          "rule": "AW-ALT-004",
          "selector": "#link-home img",
          "severity": "blocker",
          "note": "Linked image alt is 'logo'; it should name the destination, for example 'Home'."
        },
        {
          "rule": "AW-ALT-004",
          "selector": "#link-next img",
          "severity": "blocker",
          "note": "Linked image has empty alt and the link has no other text, so the link has no name."
        }
      ]
    },
    {
      "page": "04-outline-none.html",
      "url": "https://a11y.world/agents/test-corpus/04-outline-none.html",
      "expected": [
        {
          "rule": "AW-FOCUS-001",
          "selector": "a:focus, button:focus",
          "severity": "blocker",
          "note": "outline: none with no replacement ring in the same rule. The .btn:focus-visible rule replaces it for the button but links are left with nothing."
        }
      ]
    },
    {
      "page": "05-focus-contrast.html",
      "url": "https://a11y.world/agents/test-corpus/05-focus-contrast.html",
      "expected": [
        {
          "rule": "AW-FOCUS-002",
          "selector": "#link-dark",
          "severity": "major",
          "note": "Ring #2a7de1 on background #0b3d5c is about 2.8:1, below 3:1. The same ring passes on white."
        }
      ]
    },
    {
      "page": "06-fake-buttons.html",
      "url": "https://a11y.world/agents/test-corpus/06-fake-buttons.html",
      "expected": [
        {
          "rule": "AW-KEY-001",
          "selector": "#save",
          "severity": "blocker",
          "note": "div with onclick; not focusable, no keyboard handler. Use a button."
        },
        {
          "rule": "AW-KEY-001",
          "selector": "#cancel",
          "severity": "blocker",
          "note": "span with role=button and onclick but no tabindex or key handling."
        },
        {
          "rule": "AW-KEY-002",
          "selector": "#help",
          "severity": "major",
          "note": "tabindex=\"3\" reorders focus."
        }
      ]
    },
    {
      "page": "07-hover-only.html",
      "url": "https://a11y.world/agents/test-corpus/07-hover-only.html",
      "expected": [
        {
          "rule": "AW-KEY-003",
          "selector": ".menu:hover ul",
          "severity": "major",
          "note": "Submenu opens only on hover; no :focus-within and the button does not toggle it."
        },
        {
          "rule": "AW-KEY-003",
          "selector": ".card:hover .actions",
          "severity": "major",
          "note": "Delete button is invisible until hover; keyboard users tab to an invisible control."
        }
      ]
    },
    {
      "page": "08-unlabeled-inputs.html",
      "url": "https://a11y.world/agents/test-corpus/08-unlabeled-inputs.html",
      "expected": [
        {
          "rule": "AW-NAME-001",
          "selector": "#name",
          "severity": "blocker",
          "note": "Only a placeholder; no label."
        },
        {
          "rule": "AW-NAME-001",
          "selector": "#plan",
          "severity": "blocker",
          "note": "Select has no label."
        }
      ]
    },
    {
      "page": "09-unnamed-controls.html",
      "url": "https://a11y.world/agents/test-corpus/09-unnamed-controls.html",
      "expected": [
        {
          "rule": "AW-NAME-002",
          "selector": "#btn-archive",
          "severity": "blocker",
          "note": "Icon-only button with no accessible name."
        },
        {
          "rule": "AW-NAME-003",
          "selector": "#link-1",
          "severity": "minor",
          "note": "Link text is 'Click here'."
        }
      ]
    },
    {
      "page": "10-contrast.html",
      "url": "https://a11y.world/agents/test-corpus/10-contrast.html",
      "expected": [
        {
          "rule": "AW-COLOR-001",
          "selector": "#muted-1",
          "severity": "major",
          "note": "#9ca3af on white is about 2.5:1."
        },
        {
          "rule": "AW-COLOR-002",
          "selector": "#status-1",
          "severity": "major",
          "note": "Payment failed state is shown by red color alone; no icon or wording says it failed."
        }
      ]
    },
    {
      "page": "11-headings.html",
      "url": "https://a11y.world/agents/test-corpus/11-headings.html",
      "expected": [
        {
          "rule": "AW-STRUCT-001",
          "selector": "#h1-2",
          "severity": "major",
          "note": "Second h1 on the page."
        },
        {
          "rule": "AW-STRUCT-001",
          "selector": "#h4-1",
          "severity": "major",
          "note": "h2 to h4 skips a level."
        }
      ]
    },
    {
      "page": "12-document.html",
      "url": "https://a11y.world/agents/test-corpus/12-document.html",
      "expected": [
        {
          "rule": "AW-STRUCT-002",
          "selector": "html",
          "severity": "major",
          "note": "No lang attribute; title is 'Untitled'."
        },
        {
          "rule": "AW-STRUCT-003",
          "selector": "meta[name=viewport]",
          "severity": "blocker",
          "note": "user-scalable=no and maximum-scale=1 disable zoom."
        }
      ]
    },
    {
      "page": "13-motion.html",
      "url": "https://a11y.world/agents/test-corpus/13-motion.html",
      "expected": [
        {
          "rule": "AW-MOTION-001",
          "selector": ".badge",
          "severity": "major",
          "note": "Infinite animation with no prefers-reduced-motion override."
        },
        {
          "rule": "AW-MOTION-001",
          "selector": ".panel",
          "severity": "major",
          "note": "1.2s transition with no prefers-reduced-motion override."
        }
      ]
    },
    {
      "page": "14-clean.html",
      "url": "https://a11y.world/agents/test-corpus/14-clean.html",
      "expected": []
    }
  ]
}
