<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: JagheterAlex</title>
    <description>The latest articles on DEV Community by JagheterAlex (@jagheteralex).</description>
    <link>https://dev.to/jagheteralex</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4087232%2F6f8be1f2-044b-4abc-a847-392fce0fa805.jpg</url>
      <title>DEV Community: JagheterAlex</title>
      <link>https://dev.to/jagheteralex</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jagheteralex"/>
    <language>en</language>
    <item>
      <title>Your accessibility scanner found 47 issues. A regulator will ask about clause 9.1.4.3.</title>
      <dc:creator>JagheterAlex</dc:creator>
      <pubDate>Fri, 21 Aug 2026 08:49:16 +0000</pubDate>
      <link>https://dev.to/jagheteralex/your-accessibility-scanner-found-47-issues-a-regulator-will-ask-about-clause-9143-1jfm</link>
      <guid>https://dev.to/jagheteralex/your-accessibility-scanner-found-47-issues-a-regulator-will-ask-about-clause-9143-1jfm</guid>
      <description>&lt;p&gt;Enforcement of the European Accessibility Act started on 28 June 2025, and it&lt;br&gt;
started for real. French disability organisations issued formal notices to four&lt;br&gt;
major grocery retailers within days. Sweden opened market surveillance that&lt;br&gt;
October. The first EAA cases reached a French commercial court in November.&lt;/p&gt;

&lt;p&gt;If you sell into the EU and you are not a microenterprise providing services,&lt;br&gt;
somebody can now ask you what you have done about it.&lt;/p&gt;

&lt;p&gt;The awkward part is that the tooling most teams reach for does not produce an&lt;br&gt;
answer to that question. It produces a different, adjacent answer, and the gap&lt;br&gt;
between the two is where a lot of otherwise diligent teams are about to get&lt;br&gt;
caught.&lt;/p&gt;
&lt;h2&gt;
  
  
  The mismatch
&lt;/h2&gt;

&lt;p&gt;You run axe, or Lighthouse, or Pa11y. You get output like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;color-contrast          10 nodes   serious
label                    1 node    critical
image-alt                1 node    critical
link-name                1 node    serious
html-has-lang            1 node    serious
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Correct, useful, and not a conformance claim.&lt;/p&gt;

&lt;p&gt;Conformance under the EAA is claimed against &lt;strong&gt;EN 301 549&lt;/strong&gt;, the harmonised&lt;br&gt;
European standard, clause by clause. Nobody has ever been asked to demonstrate&lt;br&gt;
conformance with &lt;code&gt;color-contrast&lt;/code&gt;. They get asked about clause 9.1.4.3.&lt;/p&gt;

&lt;p&gt;So the translation has to happen somewhere. Usually it happens in a spreadsheet,&lt;br&gt;
by hand, by whoever drew the short straw, and it happens again every time the&lt;br&gt;
site changes.&lt;/p&gt;
&lt;h2&gt;
  
  
  Three things that make this worse than a naming problem
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Not all of WCAG is binding, and the binding part is about to move.&lt;/strong&gt; The&lt;br&gt;
harmonised standard today is EN 301 549 V3.2.1 (2021-03), which adopts &lt;strong&gt;WCAG&lt;br&gt;
2.1&lt;/strong&gt;. Criteria introduced in WCAG 2.2 — target size, dragging movements,&lt;br&gt;
accessible authentication — are good practice, not current EAA obligations.&lt;br&gt;
Plenty of tools report 2.2 findings with the same red badge as everything else,&lt;br&gt;
which inflates your problem and burns engineering time on work no regulator is&lt;br&gt;
asking for yet.&lt;/p&gt;

&lt;p&gt;The word doing the work there is &lt;em&gt;yet&lt;/em&gt;. &lt;strong&gt;EN 301 549 V4.1.1 adopts WCAG 2.2 and&lt;br&gt;
is expected to be cited in the Official Journal around the end of 2026.&lt;/strong&gt; An&lt;br&gt;
obligation begins when a version is cited there, not when ETSI publishes it, so&lt;br&gt;
V3.2.1 is still the yardstick as I write this and will not be for much longer.&lt;br&gt;
Anyone telling you 2.2 is already mandatory is wrong today. Anyone telling you to&lt;br&gt;
ignore it is setting you up for a rewrite.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Severity is not exposure.&lt;/strong&gt; Rule engines sort by how confidently they can&lt;br&gt;
complain. Ten contrast failures in a footer will outrank one unlabelled password&lt;br&gt;
field in the checkout, and that ordering is exactly backwards from the one that&lt;br&gt;
matters. One of those stops a person from buying something. The other is real,&lt;br&gt;
required, and not an emergency.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A clean automated run is not a pass.&lt;/strong&gt; Automated testing detects roughly a&lt;br&gt;
third of accessibility barriers. Keyboard traps, focus order, whether alt text&lt;br&gt;
actually says anything useful, whether a screen reader can make sense of your&lt;br&gt;
custom component — none of that is decidable by a rule engine. The clauses your&lt;br&gt;
scanner cannot evaluate do not appear in its output at all, which reads as&lt;br&gt;
silence, which reads as fine.&lt;/p&gt;
&lt;h2&gt;
  
  
  The part where money is being wasted
&lt;/h2&gt;

&lt;p&gt;Two products are sold to make this go away, and neither does.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Overlay widgets.&lt;/strong&gt; One line of JavaScript, a promise of compliance, and a&lt;br&gt;
subscription around $490 a year.&lt;/p&gt;

&lt;p&gt;The US Federal Trade Commission brought a case over exactly that promise in&lt;br&gt;
January 2025 and &lt;a href="https://www.ftc.gov/legal-library/browse/cases-proceedings/2223156-accessibe-inc" rel="noopener noreferrer"&gt;approved the final order in April&lt;/a&gt;,&lt;br&gt;
requiring accessiBe to pay &lt;strong&gt;$1,000,000&lt;/strong&gt;. The complaint also covered third-party&lt;br&gt;
articles and reviews formatted to look like independent opinions when the company&lt;br&gt;
had an undisclosed connection to them.&lt;/p&gt;

&lt;p&gt;Separately, &lt;a href="https://blog.usablenet.com/2025-midyear-accessibility-lawsuit-report-key-legal-trends" rel="noopener noreferrer"&gt;UsableNet's 2025 midyear report&lt;/a&gt;&lt;br&gt;
counted &lt;strong&gt;456 US accessibility lawsuits, 22.6% of the total&lt;/strong&gt;, filed against sites&lt;br&gt;
that already had an overlay installed. The National Federation of the Blind has&lt;br&gt;
been saying this publicly for years. The widget is a liability, not a shield.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Free statement generators.&lt;/strong&gt; They emit "this website is fully compliant"&lt;br&gt;
without testing anything. An accessibility statement is a public claim, and it&lt;br&gt;
carries your organisation's name, not the generator's. An unsupported one is the&lt;br&gt;
first document anybody investigating you will read.&lt;/p&gt;
&lt;h2&gt;
  
  
  What I built instead
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://curbcut.org" rel="noopener noreferrer"&gt;Curbcut&lt;/a&gt; is a small MIT-licensed CLI that does the&lt;br&gt;
translation and nothing else. It runs axe-core in a real headless browser on your&lt;br&gt;
machine, then reports what it found the way a conformance claim has to be&lt;br&gt;
written.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx curbcut https://example.com &lt;span class="nt"&gt;--crawl&lt;/span&gt; &lt;span class="nt"&gt;--pdf&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same findings as above, restated:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;P1  Clause 9.4.1.2 — Name, Role, Value          3 elements
P1  Clause 9.1.1.1 — Non-text Content           1 element
P2  Clause 9.3.1.1 — Language of Page           1 element
P3  Clause 9.1.4.3 — Contrast (Minimum)        10 elements
P3  Clause 9.2.4.4 — Link Purpose (In Context)  1 element
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Four things are deliberate here.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bands are exposure, not severity.&lt;/strong&gt; P1 means a person cannot finish what they&lt;br&gt;
came to do and the clause is in the harmonised standard. Ten contrast failures&lt;br&gt;
sit below one missing form label, because that is the order somebody will ask&lt;br&gt;
about them in.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WCAG 2.2 is reported separately.&lt;/strong&gt; It is in the output, clearly marked as not a&lt;br&gt;
current obligation, so you can decide rather than be alarmed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It prints what it did not check.&lt;/strong&gt; Every run lists the clauses no automated&lt;br&gt;
tool can evaluate — 9.2.1.1 keyboard operability across a whole journey, 9.3.2.3&lt;br&gt;
consistent navigation, and so on — as never assessed, rather than omitting them&lt;br&gt;
and letting the silence imply a pass.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The statement draft refuses to overclaim.&lt;/strong&gt; It will not produce a&lt;br&gt;
full-conformance claim out of scan data, because scan data cannot support one.&lt;br&gt;
Everything needing a human decision stays a visible &lt;code&gt;[bracket]&lt;/code&gt; until a human&lt;br&gt;
fills it in.&lt;/p&gt;

&lt;p&gt;There is a &lt;code&gt;--pdf&lt;/code&gt; flag that writes a dated A4 report you can hand to a client or&lt;br&gt;
attach to an email. It is deliberately plain: no cover art, no score out of ten,&lt;br&gt;
no badge. The words "not a certificate" and "not legal advice" are on the first&lt;br&gt;
page, above the findings, because a document that looks like a certificate would&lt;br&gt;
misrepresent what automated testing can establish. That is the accessiBe&lt;br&gt;
mistake, and it is not one worth repeating in a smaller font.&lt;/p&gt;
&lt;h2&gt;
  
  
  Try it against a known answer
&lt;/h2&gt;

&lt;p&gt;Rather than ask you to trust a screenshot, there is a deliberately broken page&lt;br&gt;
published for this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx curbcut https://curbcut.org/demo/broken.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It should report five failing clauses across sixteen elements — two P1, one P2,&lt;br&gt;
two P3. If it reports something else, that is a bug and I would like the issue.&lt;/p&gt;
&lt;h2&gt;
  
  
  Proving a fix actually happened
&lt;/h2&gt;

&lt;p&gt;A single scan is a snapshot. It says nothing about direction, which is the thing&lt;br&gt;
an auditor, a client or your own manager is actually asking about.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx curbcut https://example.com &lt;span class="nt"&gt;--crawl&lt;/span&gt; &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;span class="c"&gt;# ... do the work ...&lt;/span&gt;
npx curbcut https://example.com &lt;span class="nt"&gt;--crawl&lt;/span&gt; &lt;span class="nt"&gt;--baseline&lt;/span&gt; curbcut-report/analysis.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Findings are matched by clause, not by axe rule, because a clause can start&lt;br&gt;
failing for a different reason than it did last month. A rule-keyed diff would&lt;br&gt;
call that one fix plus one new break, which badly describes a page that never&lt;br&gt;
stopped failing 9.4.1.2.&lt;/p&gt;

&lt;p&gt;And if the later scan reached fewer pages than the baseline, the comparison says&lt;br&gt;
so before anything else. Fewer failures can simply mean fewer pages were&lt;br&gt;
assessed, and presenting that as progress would be a lie by arithmetic.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this does not do
&lt;/h2&gt;

&lt;p&gt;It does not make you compliant, and you should be suspicious of anything that&lt;br&gt;
says it will. It finds what automation can find, names the clauses, and shows&lt;br&gt;
you the gaps it could not test. Closing those gaps is engineering work, and some&lt;br&gt;
of it needs a person using assistive technology.&lt;/p&gt;

&lt;p&gt;I am also not a lawyer, this is not legal advice, and Curbcut is not affiliated&lt;br&gt;
with ETSI, CEN, CENELEC or the European Commission in any way. It is software&lt;br&gt;
that references a standard those bodies publish.&lt;/p&gt;

&lt;p&gt;Source is on &lt;a href="https://github.com/JagheterAlex/curbcut" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;, MIT, and the&lt;br&gt;
clause mapping is the part worth reading critically. If a mapping is wrong, that&lt;br&gt;
is the highest-value bug you could file.&lt;/p&gt;

</description>
      <category>a11y</category>
      <category>webdev</category>
      <category>opensource</category>
      <category>compliance</category>
    </item>
  </channel>
</rss>
