attest 1.11.0 copy "attest: ^1.11.0" to clipboard
attest: ^1.11.0 copied to clipboard

Continuous accessibility-compliance engine for Flutter. Pure-Dart rules that map findings to WCAG and EN 301 549 success criteria, with CI baseline gating.

Changelog #

All notable changes to this package are documented here. The format follows Keep a Changelog and this project adheres to Semantic Versioning.

1.11.0 - 2026-07-15 #

Added #

  • Trend tracking across runs: RunSummary (a run's totals and per-severity counts), TrendLog (an append-only, length-capped history that round-trips to JSON) and RunDelta (the change since the previous run). summarizeRun builds a summary straight from a GateResult. This is the model behind the CLI's new --history flag, letting a project see its accessibility debt move over time rather than only pass/fail one run.

1.10.0 - 2026-07-15 #

Added #

  • Findings from the deterministic rules now carry a codeExample: a ready-to-paste Dart snippet showing the fix as a // Before / // After pair (missing accessible name, image alt, field label, adjustable value, heading, exposed state). It is copy-and-adapt guidance, not an edit attest applies for you — a runtime audit has the offending file:line but not the source AST, so auto-applied fixes are deliberately out of scope. The snippet is optional (null for geometric/visual findings) and rides through JSON and the SARIF result properties.

1.9.0 - 2026-07-15 #

Added #

  • Every bundled criterion now carries the canonical W3C "Understanding" URL (Criterion.understanding), the authoritative explanation of what it requires and how to satisfy it. It is surfaced as the "learn more" link on a finding: the SARIF helpUri now points at the specific criterion (so GitHub and GitLab render a per-rule link straight to the W3C guidance) instead of the generic project URL. The field is optional and JSON round-trips backward-compatibly — a criterion parsed from older output simply has a null URL.

1.8.0 - 2026-07-15 #

Changed #

  • attest/generic-link-text (WCAG 2.4.4) now strips edge decoration before matching, so the most common real-world forms of vague link text are caught: "Read more…" (trailing ellipsis), "More ›" and "Learn more!" all reduce to their generic core. Only leading/trailing non-alphanumeric runs are removed and internal words are left untouched, so a descriptive link can never collapse onto a generic phrase — precision stays 1.0 on the corpus. New corpus cases pin both the added recall and that the match remains whole-label, never a substring ("Read more about the 2026 pricing" stays silent).

1.7.0 - 2026-07-02 #

Added #

  • FlowAnalysis and StepDelta: diff an ordered sequence of audit reports — typically tester.auditFlow output — so each step's introduced and resolved findings are explicit. It pinpoints the interaction that caused a barrier ("opening the dialog introduced these two issues"), matching by the stable fingerprint. Experimental, part of the flow API.

1.6.0 - 2026-07-02 #

Added #

  • attest/generic-link-text (WCAG 2.4.4, heuristic): flags links whose whole accessible name is a generic phrase ("read more", "click here") that does not describe the destination. Scoped to links and shipped as a suppressible warning, so false positives stay near zero. This moves 2.4.4 from manual to partial in the coverage matrix. Fifteen bundled rules now.

1.5.0 - 2026-07-02 #

Added #

  • attest/adjustable-value (WCAG 4.1.2): flags adjustable controls — sliders, steppers — that respond to increase/decrease but expose no current value, so a screen reader can change the setting yet cannot announce it. A visible label is not the value. Fourteen bundled rules now.

1.4.0 - 2026-07-02 #

Added #

  • ConformanceReport: a machine-readable, clause-by-clause conformance document for a standard pack — every criterion with its coverage status, guidance and the findings mapped to it. Built with ConformanceReport.build; it is the stable substrate a dashboard or VPAT / accessibility statement consumes, with a schemaVersion bumped only on a breaking shape change.

1.3.0 - 2026-07-02 #

Added #

  • CoverageMatrix.renderTable() now prints each criterion's guidance note under it, so the text output — and attest coverage — is an actionable checklist rather than just a list of clause numbers.

1.2.0 - 2026-07-02 #

Added #

  • The coverage matrix: WcagRegistry (the single source of truth mapping every WCAG Level A/AA success criterion to automated / partial / manual coverage, with an own-words note per clause), CriterionCoverage, CoverageStatus, and CoverageMatrix.forStandard. It states, per pack, exactly what attest verifies automatically and what needs human review — no new detection, no false-positive risk. A consistency test keeps it aligned with the bundled rules.

1.1.0 - 2026-07-02 #

Added #

  • attest/non-text-contrast (WCAG 1.4.11): icons and other non-text glyphs are held to the flat 3:1 minimum instead of the text minimum. ContrastSample gained an isNonText flag; the contrast rule now skips non-text samples.

Fixed #

  • A small icon rendered below 4.5:1 but at or above 3:1 is no longer reported as a text-contrast failure. Icons are non-text content (governed by 1.4.11), so holding them to the text minimum was a false positive.

1.0.0 - 2026-07-02 #

First stable release. The public API is frozen (see below) and the rules ship with measured, published precision and recall against a validation corpus.

Added #

  • SemanticsNodeData.identifier and Finding.identifier, carrying the developer-assigned semantics identifier (SemanticsProperties.identifier). A finding resolves to the offending node's identifier, or its nearest ancestor's.
  • ContrastSample.identifier, so a contrast finding is anchored to the sampled text node the same way tree-rule findings are.
  • The validation-corpus API (package:attest/corpus.dart): CorpusCase, ExpectedFinding and CorpusCategory, the labelled ground-truth types the precision/recall harness measures each rule against.
  • MetricsHarness and CorpusMetrics: run the corpus, compute per-rule precision, recall and false-positive-on-clean rate, and evaluate a CI gate (deterministic precision must be 1.0, zero false positives on clean cases, heuristics must meet a declared threshold, and recall must not regress against a committed baseline).
  • declaredHeuristicPrecision: an explicit precision bar (0.9) for each of the four heuristic rules, enforced by the metrics gate. A contract test verifies every heuristic declares a bar, tags its findings heuristic, and is suppressible in one line via RuleConfig.disabledRules.
  • Determinism and performance guarantees are now regression-tested: identical input produces byte-identical output regardless of rule registration order, a pure layout translation leaves every fingerprint unchanged while a genuine violation change moves exactly one, and a 2000-node screen must audit within an explicit per-screen time budget.

Changed #

  • The public API is frozen for 1.0. Everything exported from package:attest/attest.dart is stable within a major, with two documented exceptions annotated @experimental (free to change in minors, always changelogged): the validation-corpus library (package:attest/corpus.dart) and TranscriptGenerator, whose announcement wording awaits cross-validation against real screen readers.
  • Stated the version-support policy: Dart SDK ≥ 3.6 (a tooling floor, not a language-feature requirement — documented in the pubspec), and toolkit-wide support for the current and previous three stable Flutter releases.

0.9.0 #

Changed #

  • attest/state-exposed now fires on a group of two or more custom controls (down from three), catching small segmented/toggle pairs that expose no selected state.

0.8.0 #

Added #

  • Versioned standard packs: Standard (en301549_v3_2_1, wcag22) and RuleConfig.standard. The engine runs a rule only when its criterion belongs to the selected pack, so attest/target-size (WCAG 2.5.8) is active only under wcag22.

0.7.0 #

Added #

  • TranscriptGenerator, which turns a snapshot into the screen-reader announcement sequence, and an AuditReport.transcript field to carry it.

0.6.0 #

Added #

  • Report layer: Baseline (accepted-fingerprint set with JSON), BaselineGate (new/known/resolved diff), and SarifWriter (SARIF 2.1.0 output).

0.5.0 #

Added #

  • Three heuristic rules, each tagged heuristic and suppressible: attest/heading-structure (1.3.1), attest/focus-order (2.4.3) and attest/state-exposed (4.1.2).
  • RuleConfig.disabledRules to mute individual rules across a run.

0.4.0 #

Added #

  • attest/contrast rule (WCAG 1.4.3): 4.5:1 for normal text, 3:1 for large, disabled controls exempt, borderline ratios downgraded to a warning.
  • SemanticsSnapshot.copyWith.

Changed #

  • ContrastSample now carries the label, bounds, font size, weight and disabled state so the rule is self-contained.

0.3.0 #

Added #

  • attest/text-overflow rule (WCAG 1.4.4) reading the text-scale observations, and the Resize Text criterion.

0.2.0 #

Added #

  • Three geometry and reachability rules: attest/target-size (WCAG 2.5.8, with a configurable platform/WCAG-minimum threshold), attest/focus-trap (2.1.1), and the heuristic attest/ambiguous-name (2.4.6).
  • TargetSizeMode and the targetSizeMode/platformTargetSize options on RuleConfig.

0.1.0 #

Added #

  • Serializable, Flutter-free data model: SemanticsSnapshot, SemanticsNodeData, Finding, Criterion, AuditReport and friends, all with value equality and JSON round-trip.
  • Rule interface, RuleEngine, RuleConfig/RuleContext, and a stable, coordinate-free Fingerprinter for baseline diffing.
  • The first four tree-walking rules: attest/interactive-name, attest/image-alt, attest/placeholder-name and attest/field-label, each bound to a WCAG and EN 301 549 criterion.
1
likes
160
points
792
downloads

Documentation

API reference

Publisher

verified publishersahland.tech

Weekly Downloads

Continuous accessibility-compliance engine for Flutter. Pure-Dart rules that map findings to WCAG and EN 301 549 success criteria, with CI baseline gating.

Repository (GitHub)
View/report issues
Contributing

Topics

#accessibility #a11y #wcag #testing

License

BSD-3-Clause (license)

Dependencies

collection, meta

More

Packages that depend on attest