{
  "audit_label": "September 2026 field audit IV",
  "ran_from": "2026-09-22",
  "ran_to": "2026-09-23",
  "build_before": "5364104",
  "build_after": "2d89faa",
  "sites_total": 58,
  "sites_compared": 51,
  "sites_blocked_both_runs": 3,
  "sites_changed_reachability": 4,
  "pages_per_site": 5,
  "findings_before": 823,
  "findings_after": 860,
  "duplicate_rows_before": 14,
  "duplicate_rows_after": 0,
  "null_rule_id_before": 0,
  "null_rule_id_after": 0,
  "by_engine": [
    {
      "engine": "arc-style",
      "kind": "engine",
      "before": 79,
      "after": 83
    },
    {
      "engine": "axe-core",
      "kind": "engine",
      "before": 177,
      "after": 185
    },
    {
      "engine": "ibm-equal-access",
      "kind": "engine",
      "before": 199,
      "after": 165
    },
    {
      "engine": "lighthouse",
      "kind": "engine",
      "before": 19,
      "after": 16
    },
    {
      "engine": "pa11y",
      "kind": "engine",
      "before": 127,
      "after": 111
    },
    {
      "engine": "focus-visibility",
      "kind": "analyzer",
      "before": 0,
      "after": 78
    },
    {
      "engine": "keyboard-nav-tester",
      "kind": "analyzer",
      "before": 3,
      "after": 1
    },
    {
      "engine": "language-check",
      "kind": "analyzer",
      "before": 1,
      "after": 0
    },
    {
      "engine": "mobile-accessibility",
      "kind": "analyzer",
      "before": 218,
      "after": 197
    },
    {
      "engine": "reflow-320",
      "kind": "analyzer",
      "before": 0,
      "after": 24
    }
  ],
  "by_class": [
    {
      "rule_id": "mobile-target-unreachable-advisory",
      "before": 46,
      "after": 30,
      "fix": "opacity, axis-aware clipping, whole scroller chain"
    },
    {
      "rule_id": "ibm-fieldset_label_valid",
      "before": 7,
      "after": 0,
      "fix": "named fieldsets and single-field wrappers"
    },
    {
      "rule_id": "ibm-aria_attribute_valid",
      "before": 13,
      "after": 7,
      "fix": "prohibited ARIA that browsers ignore at no cost; aria-checked on native inputs"
    },
    {
      "rule_id": "ibm-label_content_exists",
      "before": 7,
      "after": 2,
      "fix": "label text, title or a named control"
    },
    {
      "rule_id": "link-name",
      "before": 8,
      "after": 3,
      "fix": "icon-font glyphs are not names; accessibility-tree fallback"
    },
    {
      "rule_id": "mobile-target-size-aa-fail",
      "before": 11,
      "after": 6,
      "fix": "inline exception; spacing ignores fixed layers and other scroll boxes"
    },
    {
      "rule_id": "ibm-text_contrast_sufficient",
      "before": 29,
      "after": 24,
      "fix": "backgrounds not behind the text; fixed overlays"
    },
    {
      "rule_id": "ibm-aria_eventhandler_role_valid",
      "before": 5,
      "after": 2,
      "fix": "redundant mouse targets, empty handlers, shadow-rendered buttons"
    },
    {
      "rule_id": "input-label-missing",
      "before": 3,
      "after": 1,
      "fix": "an empty label named by its title; names from the accessibility tree"
    },
    {
      "rule_id": "ibm-svg_graphics_labelled",
      "before": 27,
      "after": 25,
      "fix": "empty, unrendered or img-hosted svgs"
    },
    {
      "rule_id": "ibm-aria_hidden_nontabbable",
      "before": 8,
      "after": 6,
      "fix": "hidden content nothing inside can focus"
    },
    {
      "rule_id": "ibm-element_tabbable_role_valid",
      "before": 21,
      "after": 19,
      "fix": "tabbable scroll containers"
    },
    {
      "rule_id": "keyboard-trap",
      "before": 3,
      "after": 1,
      "fix": "closed shadow roots and documented Escape exits"
    },
    {
      "rule_id": "ibm-aria_role_valid",
      "before": 5,
      "after": 4,
      "fix": "role=none on li is permitted"
    },
    {
      "rule_id": "label-title-only",
      "before": 3,
      "after": 2,
      "fix": "judged by the name's real source"
    },
    {
      "rule_id": "label-content-name-mismatch",
      "before": 12,
      "after": 11,
      "fix": "icon-font text; a card named by its call to action"
    },
    {
      "rule_id": "blink",
      "before": 1,
      "after": 0,
      "fix": "an empty blink has nothing to blink"
    },
    {
      "rule_id": "aria-role-invalid",
      "before": 3,
      "after": 3,
      "fix": "role=\"text\" is a low note, not an invalid role"
    },
    {
      "rule_id": "ibm-aria_role_allowed",
      "before": 3,
      "after": 3,
      "fix": "role=\"text\" is a low note"
    },
    {
      "rule_id": "aria-prohibited-attr",
      "before": 1,
      "after": 1,
      "fix": "prohibited ARIA that browsers ignore at no cost"
    },
    {
      "rule_id": "ibm-aria_descendant_valid",
      "before": 2,
      "after": 2,
      "fix": "an image flattened inside a named button is a note"
    },
    {
      "rule_id": "ibm-input_label_exists",
      "before": 3,
      "after": 3,
      "fix": "collapsed listbox; names from the accessibility tree"
    },
    {
      "rule_id": "aria-hidden-focus",
      "before": 5,
      "after": 5,
      "fix": "hidden content nothing inside can focus"
    },
    {
      "rule_id": "page-has-heading-one",
      "before": 10,
      "after": 10,
      "fix": "checked against the live page, shadow roots included"
    },
    {
      "rule_id": "ibm-label_name_visible",
      "before": 7,
      "after": 7,
      "fix": "a card named by its call to action"
    },
    {
      "rule_id": "target-size",
      "before": 17,
      "after": 17,
      "fix": "2.5.8 inline and spacing exceptions"
    },
    {
      "rule_id": "link-in-text-block",
      "before": 4,
      "after": 4,
      "fix": "a link 3:1 from its sentence"
    },
    {
      "rule_id": "color-contrast",
      "before": 16,
      "after": 16,
      "fix": "CSS filters, image-replaced text, inactive components, brand names"
    },
    {
      "rule_id": "tabindex",
      "before": 1,
      "after": 1,
      "fix": "best-practice rules cap at medium"
    },
    {
      "rule_id": "button-name",
      "before": 7,
      "after": 8,
      "fix": "names read from Chromium's accessibility tree"
    },
    {
      "rule_id": "duplicate-id",
      "before": 9,
      "after": 10,
      "fix": "labelledby copies that render the same text"
    },
    {
      "rule_id": "reflow-horizontal-scroll",
      "before": 0,
      "after": 24,
      "fix": "new: 1.4.10 measured at 320 CSS px on every page"
    },
    {
      "rule_id": "focus-indicator-invisible",
      "before": 0,
      "after": 78,
      "fix": "new: 2.4.7 measured in pixels on the first two pages"
    }
  ],
  "sites": [
    {
      "site": "apnews.com",
      "before": 27,
      "after": 17,
      "score_before": 51,
      "score_after": 56
    },
    {
      "site": "gov.hk",
      "before": 10,
      "after": 4,
      "score_before": 84,
      "score_after": 89
    },
    {
      "site": "mozilla.org",
      "before": 12,
      "after": 7,
      "score_before": 77,
      "score_after": 79
    },
    {
      "site": "techcrunch.com",
      "before": 28,
      "after": 23,
      "score_before": 54,
      "score_after": 55
    },
    {
      "site": "yle.fi",
      "before": 19,
      "after": 14,
      "score_before": 80,
      "score_after": 76
    },
    {
      "site": "khanacademy.org",
      "before": 11,
      "after": 7,
      "score_before": 76,
      "score_after": 89
    },
    {
      "site": "ionicframework.com",
      "before": 31,
      "after": 28,
      "score_before": 51,
      "score_after": 52
    },
    {
      "site": "svt.se",
      "before": 7,
      "after": 4,
      "score_before": 89,
      "score_after": 100
    },
    {
      "site": "ikea.com",
      "before": 12,
      "after": 10,
      "score_before": 84,
      "score_after": 83
    },
    {
      "site": "npr.org",
      "before": 29,
      "after": 27,
      "score_before": 61,
      "score_after": 65
    },
    {
      "site": "a11yproject.com",
      "before": 7,
      "after": 6,
      "score_before": 87,
      "score_after": 89
    },
    {
      "site": "airbnb.com",
      "before": 17,
      "after": 16,
      "score_before": 65,
      "score_after": 65
    },
    {
      "site": "canada.ca",
      "before": 7,
      "after": 6,
      "score_before": 89,
      "score_after": 100
    },
    {
      "site": "gov.uk",
      "before": 4,
      "after": 3,
      "score_before": 89,
      "score_after": 100
    },
    {
      "site": "developer.mozilla.org",
      "before": 12,
      "after": 11,
      "score_before": 83,
      "score_after": 83
    },
    {
      "site": "shoelace.style",
      "before": 16,
      "after": 15,
      "score_before": 70,
      "score_after": 72
    },
    {
      "site": "svelte.dev",
      "before": 11,
      "after": 10,
      "score_before": 79,
      "score_after": 89
    },
    {
      "site": "vuejs.org",
      "before": 17,
      "after": 16,
      "score_before": 59,
      "score_after": 59
    },
    {
      "site": "deque.com",
      "before": 7,
      "after": 7,
      "score_before": 89,
      "score_after": 89
    },
    {
      "site": "docusaurus.io",
      "before": 14,
      "after": 14,
      "score_before": 79,
      "score_after": 75
    },
    {
      "site": "design-system.service.gov.uk",
      "before": 3,
      "after": 3,
      "score_before": 100,
      "score_after": 100
    },
    {
      "site": "naver.com",
      "before": 29,
      "after": 29,
      "score_before": 59,
      "score_after": 59
    },
    {
      "site": "nextjs.org",
      "before": 27,
      "after": 27,
      "score_before": 74,
      "score_after": 70
    },
    {
      "site": "rust-lang.org",
      "before": 6,
      "after": 6,
      "score_before": 87,
      "score_after": 87
    },
    {
      "site": "squarespace.com",
      "before": 8,
      "after": 8,
      "score_before": 61,
      "score_after": 80
    },
    {
      "site": "typeform.com",
      "before": 18,
      "after": 18,
      "score_before": 75,
      "score_after": 67
    },
    {
      "site": "webaim.org",
      "before": 5,
      "after": 5,
      "score_before": 87,
      "score_after": 88
    },
    {
      "site": "allbirds.com",
      "before": 15,
      "after": 16,
      "score_before": 61,
      "score_after": 64
    },
    {
      "site": "bbc.com/hindi",
      "before": 7,
      "after": 8,
      "score_before": 53,
      "score_after": 89
    },
    {
      "site": "bbc.com/persian",
      "before": 6,
      "after": 7,
      "score_before": 59,
      "score_after": 89
    },
    {
      "site": "monzo.com",
      "before": 16,
      "after": 17,
      "score_before": 75,
      "score_after": 78
    },
    {
      "site": "notion.com",
      "before": 17,
      "after": 18,
      "score_before": 64,
      "score_after": 53
    },
    {
      "site": "rnib.org.uk",
      "before": 4,
      "after": 5,
      "score_before": 77,
      "score_after": 79
    },
    {
      "site": "ted.com",
      "before": 25,
      "after": 26,
      "score_before": 67,
      "score_after": 53
    },
    {
      "site": "wordpress.org",
      "before": 5,
      "after": 6,
      "score_before": 100,
      "score_after": 89
    },
    {
      "site": "astro.build",
      "before": 6,
      "after": 8,
      "score_before": 89,
      "score_after": 87
    },
    {
      "site": "duolingo.com",
      "before": 22,
      "after": 24,
      "score_before": 49,
      "score_after": 49
    },
    {
      "site": "go.dev",
      "before": 17,
      "after": 19,
      "score_before": 60,
      "score_after": 55
    },
    {
      "site": "gymshark.com",
      "before": 38,
      "after": 40,
      "score_before": 50,
      "score_after": 50
    },
    {
      "site": "mit.edu",
      "before": 12,
      "after": 14,
      "score_before": 78,
      "score_after": 78
    },
    {
      "site": "angular.dev",
      "before": 24,
      "after": 27,
      "score_before": 68,
      "score_after": 60
    },
    {
      "site": "theguardian.com",
      "before": 23,
      "after": 27,
      "score_before": 54,
      "score_after": 63
    },
    {
      "site": "shopify.com",
      "before": 13,
      "after": 18,
      "score_before": 79,
      "score_after": 76
    },
    {
      "site": "whitehouse.gov",
      "before": 11,
      "after": 16,
      "score_before": 87,
      "score_after": 83
    },
    {
      "site": "g1.globo.com",
      "before": 24,
      "after": 30,
      "score_before": 53,
      "score_after": 54
    },
    {
      "site": "detik.com",
      "before": 43,
      "after": 50,
      "score_before": 50,
      "score_after": 44
    },
    {
      "site": "service-public.fr",
      "before": 1,
      "after": 8,
      "score_before": 100,
      "score_after": 79
    },
    {
      "site": "hurriyet.com.tr",
      "before": 25,
      "after": 33,
      "score_before": 51,
      "score_after": 51
    },
    {
      "site": "gov.br",
      "before": 19,
      "after": 28,
      "score_before": 70,
      "score_after": 67
    },
    {
      "site": "jotform.com",
      "before": 24,
      "after": 33,
      "score_before": 49,
      "score_after": 49
    },
    {
      "site": "vimeo.com",
      "before": 32,
      "after": 41,
      "score_before": 49,
      "score_after": 49
    }
  ],
  "scores": {
    "up": 22,
    "down": 16,
    "unchanged": 13
  },
  "removed_census": {
    "total": 2583,
    "correctly_removed": 87,
    "counted_but_unlisted": 37,
    "merged_into_canonical_row": 375,
    "rebucketed": 4,
    "lost": 30,
    "unexplained": 18,
    "indeterminate": 2016,
    "policy": 16
  },
  "added_census": {
    "total": 1764,
    "justified": 523,
    "borderline": 0,
    "manufactured": 22,
    "indeterminate": 1219
  },
  "defects_fixed": 84,
  "tests_backend": 5126,
  "notes": {
    "method": "a verifier that shares no code with the scanner. Names, roles and hidden-ness come from Chromium's own accessibility tree over the DevTools protocol; contrast from rendered pixels, the glyphs isolated by screenshotting the text and then the same box with the text made transparent; id references by token lookup in the element's own root; focusability by calling focus() and reading the active element. Each occurrence keeps the scanner's page preparation (1920x1080, light theme, reduced motion, the scroll primer). The before run is the field sweep of 22-23 September on 5364104; the after run rescanned every sweep site on 2d89faa, the build with PRs #47 to #50. Every occurrence the comparison counted has a row here: target-size occurrences, which the verifier hands to a separate mobile pass, are counted as indeterminate rather than dropped.",
    "justified_label": "Justified - the verifier confirms the failure on the live page",
    "lost": "The 30 genuinely lost occurrences are on ten sites: syntax-highlighted code tokens on ionicframework.com (8) and angular.dev's editor (3) and a primary button on shoelace.style (3), all contrast; five labelledby references and one contrast row on vimeo.com; the skip link and main landmark of one detik.com page (3); two labelledby references on gymshark.com; two unnamed icons on jotform.com; an OneTrust reference and a heading level on khanacademy.org; a heading level on naver.com; and a language button on yle.fi whose visible text is not in its name. Each is filed as an open defect against the after-build. The 18 unexplained rows are occurrences the reconciliation could not resolve on the live page hours later and are shown inside Indeterminate; they are not evidence either way. The indeterminate rows are pages the other run did not analyse, target-size occurrences (judged by a separate mobile pass this census does not fold in), dynamic content whose selectors no longer resolve, and rows inside consent or ad vendors' frames.",
    "policy": "16 occurrences were removed by decisions the field sweep verified by hand, where this verifier keeps the literal reading: a tabindex on a scrolling code block needs no widget role (docusaurus.io, ionicframework.com, 6); an empty, zero-height listbox is not a nameless control (canada.ca, 2); inactive pager links are exempt from 1.4.3 (hurriyet.com.tr, 2); text hidden by image replacement is never painted (gov.uk); an icon-font ligature is not a visible label (angular.dev); an icon inside a named role=img needs no name of its own (shoelace.style); and a card link named by the call to action it shows meets 2.5.3 (vimeo.com, 3). They are neither counted as correctly removed nor as lost."
  }
}
