1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
//! Thin delegating wrapper over the canonical `wcag::en301549` mapping.
//!
//! The WCAG↔EN 301 549 table used to live only here; it has been promoted to
//! `crate::wcag::en301549` (single canonical source, with clause titles and a
//! pure status roll-up over findings). This module keeps its existing public
//! API (`map_to_bfsg`, `wcag_21_aa_criteria`, `WcagCriterionMapping`,
//! `BfsgMapping`) so `BfsgViolation.bfsg_reference` and other consumers are
//! unaffected.
//!
//! `BFSG_PARAGRAPH_WEB` stays local — it is NOT propagated into the new
//! `wcag::en301549` module or the EN 301 549 annex; see that module's doc
//! comment.
//!
//! Citation corrected 2026-09-01 (from a report-quality review): the prior
//! value, `"§12 Abs. 1"`, cited the parent Act (BFSG) but the actual
//! website-accessibility requirement ("Webseiten ... wahrnehmbar, bedienbar,
//! verständlich und robust") lives in the implementing Ordinance, BFSGV §12
//! Nr. 3 -- confirmed against the primary source
//! (<https://www.gesetze-im-internet.de/bfsgv/__12.html>). Still flagged
//! unverified: confirmed via automated web-fetch summarization, not a legal
//! review: get a legal review before relying on this exact citation.
//!
//! BFSGV §19 ("Zusätzliche Anforderungen an Dienstleistungen im
//! elektronischen Geschäftsverkehr") -- confirmed verbatim against the
//! primary source (<https://www.gesetze-im-internet.de/bfsgv/__19.html>),
//! 2026-09-04 -- has three numbered requirements. Only Nr. 3 is incorporated,
//! and only as a presence-only, manual-review scope signal (see
//! `commerce::CommerceAnalysis::identification_function_detected` and
//! `BFSG_PARAGRAPH_ECOMMERCE`), never an automated pass/fail:
//! - **Nr. 1** ("Informationen zur Barrierefreiheit der ... Produkte ...,
//! soweit diese ... vom verantwortlichen Wirtschaftsakteur zur Verfügung
//! gestellt werden") is conditional on information the operator may or may
//! not possess about a *specific product's* accessibility properties --
//! there is no DOM signal that can tell "operator has such info but
//! withheld it" apart from "product genuinely has nothing to disclose".
//! Deliberately not incorporated: a presence-only check here would
//! systematically false-flag every product without accessibility features
//! to disclose, which is not a defect.
//! - **Nr. 2** ("Identifizierungs-, Authentifizierungs-, Sicherheits- und
//! Zahlungsfunktionen, wenn diese ... im Rahmen einer Dienstleistung
//! bereitgestellt werden") largely overlaps with Nr. 3 in DOM terms but
//! adds the qualifier "as part of a service, not a product" and explicitly
//! includes payment functions -- this tool's stateless single-page model
//! essentially never reaches a live payment UI cold (same reasoning as the
//! `CommercePageKind::Cart`/`::Checkout` removal), and distinguishing
//! "service" from "product" delivery of an identification/security
//! function from a single rendered page is not reliably possible.
//! Deliberately not incorporated.
//! - **Nr. 3** ("Identifizierungsmethoden, Authentifizierungsmethoden,
//! elektronische Signaturen und Zahlungsdienste ... wahrnehmbar, bedienbar,
//! verständlich und robust") is the one sub-item with a concrete,
//! deterministic DOM signal reachable from a single rendered page: a form
//! control whose `autocomplete` token identifies it as
//! `current-password`/`new-password`/`one-time-code`/`username`
//! (`screen_reader::navigator::FormControlNavItem::is_identification_control`).
//! Payment-method detection (`cc-number` etc.) was deliberately left out
//! of scope for the same cold-reachability reason as Nr. 2. The signal is
//! necessarily incomplete (a login field without a declared `autocomplete`
//! purpose stays invisible), so it is only ever a positive-evidence
//! presence flag, never a negative "no such field exists" conclusion --
//! same honesty convention as `commerce::CommerceFinding`.
use ;
use crateEN301549_WEB_CLAUSES;
pub const BFSG_PARAGRAPH_WEB: &str = "§ 12 Nr. 3 BFSGV";
/// Citation for the BFSGV §19 Nr. 3 e-commerce identification/authentication
/// signal (`commerce::CommerceAnalysis::identification_function_detected`).
/// See this module's doc comment for the full sub-item scoping decision.
pub const BFSG_PARAGRAPH_ECOMMERCE: &str = "§ 19 Nr. 3 BFSGV";