attest 1.2.0
attest: ^1.2.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.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, 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.
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.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.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.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.0 #
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.
0.8.0 #
Added #
- Versioned standard packs:
Standard(en301549_v3_2_1,wcag22) andRuleConfig.standard. The engine runs a rule only when its criterion belongs to the selected pack, soattest/target-size(WCAG 2.5.8) is active only underwcag22.
0.7.0 #
Added #
TranscriptGenerator, which turns a snapshot into the screen-reader announcement sequence, and anAuditReport.transcriptfield to carry it.
0.6.0 #
Added #
- Report layer:
Baseline(accepted-fingerprint set with JSON),BaselineGate(new/known/resolved diff), andSarifWriter(SARIF 2.1.0 output).
0.5.0 #
Added #
- Three heuristic rules, each tagged
heuristicand suppressible:attest/heading-structure(1.3.1),attest/focus-order(2.4.3) andattest/state-exposed(4.1.2). RuleConfig.disabledRulesto mute individual rules across a run.
0.4.0 #
Added #
attest/contrastrule (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 #
ContrastSamplenow carries the label, bounds, font size, weight and disabled state so the rule is self-contained.
0.3.0 #
Added #
attest/text-overflowrule (WCAG 1.4.4) reading the text-scale observations, and theResize Textcriterion.
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 heuristicattest/ambiguous-name(2.4.6). TargetSizeModeand thetargetSizeMode/platformTargetSizeoptions onRuleConfig.
0.1.0 #
Added #
- Serializable, Flutter-free data model:
SemanticsSnapshot,SemanticsNodeData,Finding,Criterion,AuditReportand friends, all with value equality and JSON round-trip. Ruleinterface,RuleEngine,RuleConfig/RuleContext, and a stable, coordinate-freeFingerprinterfor baseline diffing.- The first four tree-walking rules:
attest/interactive-name,attest/image-alt,attest/placeholder-nameandattest/field-label, each bound to a WCAG and EN 301 549 criterion.