BarrierLab

Befunde und Berichte

Das Befundmodell aus a11y-report – zwei Achsen, vier Zustände, ein Vermerk je Regelkennung und ein schlanker JSON-Vertrag.

Zwei Achsen, nicht drei

Outcome sagt, wie sicher die Aussage ist, Severity, wie schwer das Problem wiegt.

OutcomeBedeutung
failautomatisch festgestelltes Problem, eindeutig belegt
reviewpotenzielles Problem, nur heuristisch vermutet, braucht menschliche Bestätigung
passautomatische Prüfung bestanden, wird geführt, aber standardmäßig nicht angezeigt
untestedautomatisiert nicht beurteilbar, grundsätzlich oder weil dem Host die Daten fehlen

Severity reicht von low über medium und high bis critical. Für Werkzeuge, die die axe-Vokabel erwarten, liefert Severity::as_axe_impact minor, moderate, serious und critical.

Eine dritte Achse „certainty” gibt es bewusst nicht. Sie wäre weitgehend dieselbe Achse doppelt, weil fail ohnehin automatisch festgestellt heißt, review heuristisch und untested nur manuell beurteilbar. Eine Regel, die ihre Aussage nur vermuten kann, liefert deshalb review, nicht fail mit niedriger Gewissheit.

Kein Score

Summary zählt Zustände und Schweregrade, mehr nicht. Schweregrade zählen nur über Probleme, also fail und review; Summary::problems ist deren Summe. untested zählt nicht mit, weil es keine Aussage trifft. Ein aggregierter Prozentwert würde genau die Unterscheidung einebnen, für die es die vier Zustände gibt.

Ein Vermerk je Kennung

Report hat drei Felder: findings, rule_runs und summary. RuleRun beantwortet „lief das überhaupt?”, Finding beantwortet „was kam dabei heraus?”. Die Vermerke werden je Befund-Kennung geführt, nicht je übergeordneter Regel. Damit benutzen rule_runs und findings dieselbe Namensmenge und lassen sich über rule_id verbinden.

Wer dieselbe Seite unter mehreren Bedingungen prüft, führt je Durchgang einen Vermerk mit viewport; der Schlüssel ist dann (rule_id, viewport). Ein nicht gelaufener Vermerk kann mit wcag nennen, welches Kriterium ungeprüft blieb.

Der JSON-Vertrag

Ein Befund trägt vier Pflichtfelder: rule_id, outcome, severity und message. Alles andere fällt weg, wenn es nicht gesetzt ist:

{
  "rule_id": "images/alt-missing",
  "outcome": "fail",
  "severity": "high",
  "message": "The image has no alt attribute.",
  "location": {
    "node": "15"
  },
  "wcag": [
    "1.1.1"
  ]
}

Der Befund stammt aus examples/teaser.semantik.json. Die optionalen Felder:

FeldInhalt
rule_namemenschenlesbarer Name der Regel
locationfile, url, selector, node, source_hint
role, nameberechnete Rolle und Accessible Name des Elements
wcag, wcag_levelErfolgskriterien und Stufe A, AA oder AAA
tagsfreie Schlagworte
help, help_url, suggestion, suggested_codewas zu tun ist
snippetdas betroffene Markup, soweit der Host es liefern kann
evidenceBelege mit source, field, value

Platz für das, was nicht in den Vertrag gehört

Finding::extra ist ein undurchsichtiger Slot für werkzeugspezifische Beigaben, etwa den Element-Screenshot, den auditmysite für seinen PDF-Bericht zuschneidet. Er reist mit dem Befund, wird nie serialisiert und zählt nicht zur Identität: Zwei inhaltlich gleiche Befunde bleiben gleich, auch wenn an einem ein Screenshot hängt.

use a11y_report::Finding;

struct Screenshot(Vec<u8>);

let f = Finding::fail("images/alt-missing", "kein alt")
    .with_extra(Screenshot(vec![0x89, 0x50]));

assert_eq!(f.extra.get::<Screenshot>().map(|s| s.0.len()), Some(2));

Edit this page on GitHub