attest
Continuous accessibility-compliance engine for Flutter. Pure-Dart rules that map findings to WCAG and EN 301 549 success criteria, with CI baseline gating.
1.11.0
sahland/attest
What this package is like to depend on
Last release 1 months ago
17 Jul 2026
Too new to tell
only 2 release windows
Nearly every release is documented
notes for 11 of 11 stable releases
Nothing withdrawn
no release was ever pulled
1 months old
11 releases · first in 2026
11 releases in the last 12 months
see the full history below
Release timeline
11 releases · Jul 2026 to Jul 2026Releases
latest 11-
1.11.017 Jul 2026Release notes
Open source →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) andRunDelta(the change since the previous run).summarizeRunbuilds a summary straight from aGateResult. This is the model behind the CLI's new--historyflag, letting a project see its accessibility debt move over time rather than only pass/fail one run.
- Trend tracking across runs:
-
1.10.015 Jul 2026Release notes
Open source →Added
- Findings from the deterministic rules now carry a
codeExample: a ready-to-paste Dart snippet showing the fix as a// Before/// Afterpair (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 offendingfile:linebut 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.
- Findings from the deterministic rules now carry a
-
1.7.005 Jul 2026Release notes
Open source →FlowAnalysis diffs an ordered sequence of audit reports — the output of
tester.auditFlow — so each step's introduced and resolved findings are
explicit. Instead of "here are N reports" it says "opening the dialog
introduced these two issues", matching by the stable fingerprint so a pure
layout shift between steps is not counted as a change.
introducedByInteractions excludes the initial screen's own findings.This makes interaction-aware auditing actionable — it names the interaction
responsible. Releases attest 1.7.0 (FlowAnalysis, StepDelta) and attest_flutter
1.2.1 (requires it, documents FlowAnalysis in the flow section); attest_cli is
unchanged.Release notes
Open source →Added
FlowAnalysisandStepDelta: diff an ordered sequence of audit reports — typicallytester.auditFlowoutput — 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.005 Jul 2026Release notes
Open source →attest/generic-link-text flags links whose whole accessible name is a generic
phrase — "read more", "click here", "here", "learn more" and the like — that
tells a screen-reader user nothing about the destination, which matters most
when they pull up an out-of-context list of links.WCAG 2.4.4 allows the purpose to be clear from surrounding context, so this is
a heuristic: a suppressible warning, scoped to actual links (not buttons), with
a declared precision bar of 0.9. It moves 2.4.4 from manual to partial in the
coverage matrix. Ships with rule fixtures, nine corpus cases (precision and
recall 1.0), and its heuristic-contract entry.Fifteen bundled rules; corpus at 137 cases. Releases attest 1.6.0 and
attest_flutter 1.1.2 (dep bump + docs); attest_cli is unaffected.Release notes
Open source →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.005 Jul 2026Release notes
Open source →attest/adjustable-value flags adjustable controls — sliders, steppers — that
respond to the increase or decrease action but expose no current value. A
screen reader lets the user change the setting yet cannot announce what it is,
and a visible label ("Volume") is not the value. This is the Value leg of
Name, Role, Value that the existing rules did not cover.Deterministic, tree-only, so no Flutter-side change: the builder already
captures increase/decrease actions. Ships with rule fixtures, ten corpus cases
(precision and recall 1.0), and its entry in the coverage matrix under 4.1.2.
Fourteen bundled rules; corpus at 128 cases.Releases attest 1.5.0 and attest_flutter 1.1.1 (which just requires the new
core and refreshes its docs); attest_cli is unaffected.Release notes
Open source →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.003 Jul 2026Release notes
Open source →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 withConformanceReport.build; it is the stable substrate a dashboard or VPAT / accessibility statement consumes, with aschemaVersionbumped only on a breaking shape change.
-
1.3.003 Jul 2026Release notes
Open source →Added
CoverageMatrix.renderTable()now prints each criterion's guidance note under it, so the text output — andattest coverage— is an actionable checklist rather than just a list of clause numbers.
-
1.2.002 Jul 2026Release notes
Open source →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, andCoverageMatrix.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.
- The coverage matrix:
-
1.1.002 Jul 2026Release notes
Open source →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.ContrastSamplegained anisNonTextflag; 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.002 Jul 2026Release notes
Open source →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.identifierandFinding.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,ExpectedFindingandCorpusCategory, the labelled ground-truth types the precision/recall harness measures each rule against. MetricsHarnessandCorpusMetrics: 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 findingsheuristic, and is suppressible in one line viaRuleConfig.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.dartis 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) andTranscriptGenerator, 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.001 Jul 2026Release notes
Open source →Changed
attest/state-exposednow fires on a group of two or more custom controls (down from three), catching small segmented/toggle pairs that expose no selected state.