Skip to content
Accessibility as a requirement

Case · Accessibility · WCAG 2.2

Accessibility as an engineering requirement

How A11Y.md was incorporated into the development of this site — and what changed the result.

  1. A11Y.md
  2. Development with agents
  3. Validation
  4. Result

This page does not state that the site is accessible. It shows the process used, what was measured, by whom, and what has not yet been verified. The facts cited point to a public repository file or commit; what is inference is marked as such.

occurrences at first automatic measurement (2026-10-03)
207
occurrences detected by the automated gate outside the 7 utilitarian pages except registered (2026-10-05)
0
status of the verification report (REPORT.md)
Conditional
tests with real screen reader
0

The zero of the second item applies to the WCAG rules of the axe, measured at 1280 px and without the content of third-party iframes (such as YouTube player), and for the minimum width, motion and spacing probes. This does not mean the absence of accessibility barriers: it is only the result of automated checks performed under these conditions. It doesn't cover what requires human verification. Details in Result and Limits.

View real flow View code changes See what not verified

Format
Technical Case
Depth
In-depth reading · ~4 min for central idea · ~21 min complete

You prefer the essentials first? Read synthesis (~1 min)

01 · The Problem

An interface can pass the test and still block someone

Current interfaces accumulate animation, custom-made components, content that only appears with JavaScript and mouse-designed interactions. Each layer is a place where the keyboard, screen reader or zoom may fail without which the developing person notices.

What existed before

Fact Before the work described here, the site already ran the axe — an open engine testing a page against WCAG's automated rules, the W3C accessibility guidelines — CI, the system that performs the tests automatically at each change. But only on 14 of the 41 pages, and without WCAG 2.2 criteria.

When the measurement began to cover all the pages, on the production build (the compiled version that goes on air), found 207 occurrences in 36 pages, about 128 of them text with contrast below the minimum. Reading the code still found problems that no automatic rule pointed out. Example: a modal of cookies that was announced as a modal for the screen reader, but did not focus on it.

Evidence: initial audit (accessibility-audit.md), find G-01 · commit a5ef956.

Where the AI enters

Fact By 2026-10-05, 162 of the 352 commits of the repository register co-authorship of a Claude model (161 of the 265 that are not of merge). All the commits of the accessibility work, except those of merge, have this co-authorship, with the models Sonnet 5.5 and Opus 5.5, via Claude Code. Configuration stays in folder .claude/ from the repository.

To reproduce: git log da61b0a --format=%H%n%B and count commits with the line Co-Authored-By: Claude.

Inference An agent produces what context requires. If the context does not speak of focus, contrast or screen reader, nothing guarantees that the code will handle it. Hence the premise of the work: the accessibility requirement needs to be in the context that guides the agent, and not only in a review later. This premise was not measured in this project; it justified the decision of the next section.

02 · The decision

Adopting A11Y.md as agent context

A11Y.md is an open standard (MIT license), maintained by Felipe A. Carriço, written to be read by AI agents that generate interface. The version used here is 2.2.0, which targets WCAG 2.2 AA level.

What A11Y.md offers

Behavioral contract

Rules for the agent: do not assume accessibility without evidence in the code, propose a native element instead of a clickable div, explain the cost of each choice.

Compliance profile

Three levels: Shield (AAA), Standard (AA) and Launchpad (A). At WCAG, A is the minimum and AAA the most demanding. This site uses Standard.

Load on demand

A main file and guides per component (modal, tabs, form, media), read only when the task involves that component.

Memory of decisions and exceptions

A11Y-DECISIONS.md keeps choices between valid alternatives. EXCEPTIONS.md registers accepted deviation, with owner and revision date.

Delivery report

REPORT.md completed from a template: what was verified, what failed and what no one verified.

Independent verification

Whoever wrote the code can't be the only one who attests that it's compliant. The report declares the level of independence of the verification. If the only verifier is who wrote the code (self-reported), the report cannot be approved.

How the pattern entered the repository

Fact The architecture specification compared three ways: point to the remote file, copy a fixed version or integrate everything, including the Python tools. The chosen one, approved by the site owner in 2026-10-03, was the fixed copy: the files stay in docs/a11y/, stuck to a commit from the original repository (069e213) and without local edition. House adjustments go to decision files and exceptions, never to copy.

The main file is not loaded in every agent conversation: 41 KB would cost about 10,000 tokens (the unit in which the template measures the text you read) per session, including tasks unrelated to the interface. Instead, the AGENTS.md — the instructions that every agent reads in this repository — has a conditional rule (file key, without Markdown formatting):

Ao criar ou editar UI (src/**/*.html|css, src/js/**), aplique
docs/a11y/A11Y.md e carregue só o guia do componente
em docs/a11y/references/ — não o diretório inteiro.

A11Y.md also brings a verifier written in Python, the verify-a11y.py. Because it was another author's code, it was read before it was executed, and it only ran after it was approved.

Evidence: architecture. md, section 2 · source of copy (UPSTREAM. md) · AGENTS.md.

03 · How it was implemented

The real flow from protocol to gate

The summary "require, context, code, validation" is more linear than what happened. There were nine stages between 2026-10-03 and 2026-10-05, and several of them found faults that the previous ones had missed.

  1. Protocol as source

    Fixed copy of A11Y.md in docs/a11y/, with registered origin.

    Evidence: commit a5ef956 (Phase 1).

  2. Agent context

    A rule in the file AGENTS.md applies for every interface edition. The sub-agent repository reviewer, the a11y-design-reviewer, already existed; in audit v2 he started to check pages against A11Y.md and WCAG 2.2, instead of WCAG 2.1.

    Evidence: AGENTS.md · sub-agent reviewer definition, updated commit 37f22b7.

  3. Initial audit

    axe on the production build in 41 pages in portuguese, more keyboard probes, 320 px width and reduced movement: 3 critical findings, 8 high, 4 medium and 1 process. Four themes were "not audited", including real screen reader and subtitles.

    Evidence: accessibility-audit.md, section 2.

  4. Ratchet on gate

    Gate is the battery of checks that a change needs to pass to be accepted. It entered a script that measures the production build, served locally, and compares it to a reference file. If a count goes up, the gate fails. If you go down and no one records the gain, it fails, too. The debt can only decrease.

    Evidence: scripts/a11y-sweep.mjs · tests/a11y/baseline.json.

  5. Correction in five phases

    Contrast; consent of cookies; page structure and jump link; 320 px width and movement; interactive tasks. From Phase 2 to Phase 5, each one lowered the ratchet reference. In Phase 6 the measurement was expanded and the count rose from 34 to 38 (see table). From the third stage onwards, each brought new browser tests.

    Evidence: implementation-plan.md · PR #81.

  6. Independent review by agent in new context

    An agent in a new context, in a session with no memory of the previous work, who did not read the specifications, tests or code history, wrote the probes themselves (automatic tests for this site) on 75 pages and found 4 high gravity faults that the existing tests did not see. One of them: the cookie banner covered 29 of the 131 Tab stops on the home page. The review was carried out in a separate context, but remains an automated AI evaluation and does not replace an independent human evaluation.

    Evidence: verificacao-independente-fase7.md · corrections in commit c9d085c.

  7. Static report and gate

    The report REPORT.md was filled from the A11Y.md template, with CONDITIONAL status. The static checker entered the gate with a ceiling of errors that can only decrease.

    Evidence: commit 31edc75 · PR #82.

  8. External Find

    An external scanner pointed out 2 elements whose accessible name did not match the visible text. The probe then written on all pages found 60 divergences in 46 pages. In Axe, the rule that detects this (label-content-name-mismatch) comes off by default.

    Evidence: commit 6f6d01c · PR #84.

  9. Audit v2

    Audit v2 measured what the report listed as "not measured", separating fact, inference and hypothesis. She is not independent: the same work that wrote her corrected the findings. Among other flaws, he found a simulator exercise Operation Cognitive Capital (OCC) that could not be completed without mouse and locked the following chapters. The ratchet has gained new metrics: text spacing, hidden content without JavaScript and best practice rules of the axe.

    Evidence: auditoria-v2.md · PR #85.

Today, every pull request for the main branch runs the full gate in CI: turnstile, static verifier and Playwright tests in Chromium, Firefox and WebKit. The deploy, however, does not expect this result (see Limits). Gate prevents certain failures from advancing through the protected flow of development; this does not mean that all accessibility regression is blocked before going on air.

04 · What changed in the code

Seven changes and the code snippet of each

Each card follows the same format: problem, change, WCAG criterion and evidence. The snippets are lines copied from commits. Lines with - exited, lines with + came in, and … Mark lines omitted.

Cookie modal becomes a <dialog> native

Problem
The modal was announced as modal (aria-modal), but did not take the focus inside, did not contain it and did not return it when closing.
Change
The native element <dialog> with showModal(): the browser moves the focus, leaves the rest of the page inert and closes with Esc. Of the 11 new tests, 10 failed the old code.
Criteria
WCAG 2.4.3 Focus order, 2.1.2 No keyboard lock, 4.1.2 Name, function, value.
Evidence
commit a1fe89f, src/js/cookie-consent.js
-    const backdrop = document.createElement('div');
-    backdrop.className = 'cc-modal-backdrop';
-    backdrop.setAttribute('role', 'dialog');
-    backdrop.setAttribute('aria-modal', 'true');
+    const dialog = document.createElement('dialog');
+    dialog.className = 'cc-dialog';
+    dialog.setAttribute('aria-labelledby', 'cc-modal-title');
…
+        dialog.showModal();
+        dialog.querySelector('#cc-modal-title').focus(); // o leitor de tela lê "diálogo" + o título

Jump Link and <main> on every page

Problem
Only 16 out of 41 pages had a link to skip navigation, and 14 pages did not mark the main region with the element <main>. Without this link, those who use keyboards go through all navigation before reaching the content.
Change
Jump to content as the first focusable element, with the main region as target. The first version of the link had white background; the verifier of the site itself, which prohibits clear background (visual rule of the house, not accessibility), failed, and the link passed to the dark theme.
Criteria
WCAG 2.4.1 Ignore blocks, 1.3.1 Information and relationships.
Evidence
commit 3bb4900, src/404.html · Dark theme in commit f09b042
-    <div>
+    <a class="a11y-skip" href="#conteudo">Pular para o conteúdo</a>
+    <main id="conteudo">
         <h1>404</h1>
…
-    </div>
+    </main>

Contrast resolved in color palette, not page by page

Problem
The supporting text in gray-500 gave from 3.15:1 to 4.16:1 on the background of the site, below the minimum of 4.5:1. The blue #007bff was used as a text color.
Change
One color for each function. Support text: #99a1af, 7.27:1 on the background color #0d1117. Blue text: #58a6ff, 7.49:1. The color #007bff was restricted to backgrounds, edges and icons. About 128 disapproved passages fell to 2, on an exception page.
Criteria
WCAG 1.4.3 Contrast (minimum).
Evidence
commit 90e6e8e, src/catalogo.html and src/curriculo.html · rule in A11Y-DECISIONS.md
-    <footer class="bg-gray-950 text-gray-500 py-12 text-center text-sm border-t border-white/5">
+    <footer class="bg-gray-950 text-gray-400 py-12 text-center text-sm border-t border-white/5">
…
-            color: #007bff;
+            color: #58a6ff;

Grids that fit at 320 px

Problem
At 320 px wide (the equivalent of 400% zoom on a 1280 px screen), 14 pages required horizontal scrolling. The common cause: grid with minimum width larger than the screen.
Change
The minimum column becomes the lowest between 100% and the original value. The same pattern was applied to other grids. In the other pages the causes were other: grid items without minimum width zero, code blocks and wide tables, and a tooltip. The pattern already existed in index.css.
Criteria
WCAG 1.4.10 Reflow.
Evidence
commit ba640d7, src/case-agents.css
-  grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
+  grid-template-columns: repeat(auto-fit, minmax(min(100%, 320px), 1fr));

Focus ring visible on all pages

Problem
In dark background, Chrome's standard focus ring came out almost black, rgb(16,16,16). Those who navigate by keyboard could not see where it was.
Change
A Vite plugin injects a blue ring of 2 px on every page. The selector :where() It has zero specificity, so the style of each page itself remains valid. In the v2 audit the same plugin started to reserve space at the top, so the focus did not stay under fixed headers.
Criteria
WCAG 2.4.7 Visible focus; 2.4.11 Focus not obscured.
Evidence
commit cb060c6 and commit 37f22b7, vite.config.js
+const focusBase = () => ({
+  name: 'a11y-focus-base',
+  transformIndexHtml: () => [
…
+        ':where(a[href],button,summary,input,select,textarea,[tabindex]:not([tabindex="-1"])):focus-visible{outline:2px solid #58a6ff;outline-offset:2px}' +
+        'summary:focus-visible{outline-offset:-4px}',

The accessible name starts with the visible text

Problem
Links with aria-label different from the text on the screen. Those who use voice control speak what they see, and the command does not find the element.
Change
The accessible name becomes the visible text; the new tab notice goes in visually hidden text, which enters the accessible name. A new test checks all the pages, because Axe comes with this rule off.
Criteria
WCAG 2.5.3 Label in name.
Evidence
commit 6f6d01c, scripts/gen-portfolio.mjs (the home page generator)
-${alura ? `<p class="pf-alura-all"><a href="${esc(alura.Verificacao)}" ${ext('Certificado geral Alura')}>Ver certificado geral Alura</a></p>` : ''}`;
+${alura ? `<p class="pf-alura-all"><a href="${esc(alura.Verificacao)}" target="_blank" rel="noopener noreferrer">Ver certificado geral Alura<span class="pf-sr"> (abre em nova aba)</span></a></p>` : ''}`;

Before, ext() injection aria-label="… (abre em nova aba)", which replaced the visible text in the link name.

A drag exercise gains path by keyboard

Problem
In Chapter 3 of the OCC simulator, the fraction was only mounted with the mouse by dragging or clicking. The blocks were focused, but Enter and Espaço did nothing, and the destination zones were not even focused. Without completing this exercise, chapters 4 to 6 were not released.
Change
The path "select and place": block and destination zone respond to Enter and Space, and the chosen block announces the state with aria-pressed. The two continue to be div with role=button, because Firefox does not drag a native button marked as dragable.
Criteria
WCAG 2.1.1 Keyboard.
Evidence
commit 37f22b7, src/js/operacao-capital-cognitivo/chapters.js
+  const asButton = (node, activate) => {
+    node.setAttribute('role', 'button'); node.tabIndex = 0;
+    node.addEventListener('click', activate);
+    node.addEventListener('keydown', (e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); activate(); } });
…
-    chip.textContent = b.label; chip.tabIndex = 0; chip.dataset.concept = b.c; chip.draggable = true;
+    chip.textContent = b.label; chip.dataset.concept = b.c; chip.draggable = true;
+    chip.setAttribute('aria-pressed', 'false');

The turnstile, phase by phase

The count of occurrences recorded in the reference of the ratchet at the end of each phase. An occurrence is a unit accounted for by the validation gate: an element disapproved by a rule, or a failure of a probe itself (without <main>, no jump link, scroll at 320 px, animation under reduced motion). It does not necessarily represent a distinct violation of WCAG.

Number of occurrences in the ratchet at the end of each phase. Source: commit messages and implementation-plan.md.
Phase Commit Number of occurrences
1 · First measurement (41 pages in Portuguese) a5ef956 207
2 · Contrast 90e6e8e 81
3 · Cookie consent a1fe89f 79
4 · Structure and jump link 3bb4900 48
5 · Reflow, zoom and motion ba640d7 34
6 · Interactive tasks; measurement includes pages in English (75 in total) cb060c6 38

Phase 4 started with 77, not 79: a parallel correction (commit a191c24, 2 occurrences) entered by merge. The rise from 34 to 38 came from 4 animations of an external CDN on the administration pages. At the end of Phase 5, the 34 occurrences were all on the utilitarian pages recorded in EXCEPTIONS.md; the 38 of Phase 6 as well. Audit v2 added new metrics, with own count (see Result).

Causation limit

The fall of 207 occurrences to the current state occurred during a set of changes that included new rules, tests, probes, corrections and changes in the measurement scope. This report does not isolate the effect of A11Y.md, and there is no controlled experiment. What he demonstrates is that the protocol was incorporated into the engineering process and began to guide the context used in implementation and validation.

05 · Validation

Who checked what?

The A11Y.md separates three types of verification: the automatic, the done by someone who did not write the code and the one who requires a person. This project has the first two. The third is almost all pending.

WCAG 2.2 AA is used here as an engineering and validation reference. This does not constitute a declaration of compliance with WCAG 2.2 AA.

Automated

  • Ratchet: Axe-core 4.11.4 with WCAG 2.0 to 2.2, levels A and AA, on the production build, in 75 pages (Portuguese and English). More probes: <main>, jump link on the first Tab, a single <h1>, layout at 320 px wide, reduced motion, text spacing and hidden content without JavaScript.
  • Static checker A11Y.md: Search for prohibited code patterns (div clickable, placeholder as the only label, incomplete ARIA) and check if the report is younger than the last interface change.
  • Audit v2: New probes for what was marked "not measured". It is not independent: it was done in the same work that corrected the findings.
  • 7 Playwright suites ed tests/a11y/: Keyboard consent, visible focus by comparison of pixels, name label, 320 px width and zoom, tasks, widgets and auditor regressions.

Independent review by agent

  • Phase 7: an agent in a new context, who did not read the history, specifications or tests, re-checked on his own and found four high failures. All were corrected and won regression test.
  • Limit: It's the only independent review so far. It is automated by AI, from the same model family as the agent who wrote the code, and does not replace an independent human evaluation. The corrections made after it, from the commit c9d085c onward, were not reviewed again. That is why the report states the lowest level of independence: self-reported.

Human

  • The owner of the website approved decisions such as how to integrate the protocol and the color of the supporting text, and approved the exceptions, with a review proposed for April 2027.
  • No person tested the site with screen reader, voice control or Safari. The question about who would do this test has been unanswered since 2026-10-03.

Why not Lighthouse or an accessibility MCP

Lighthouse accessibility audit uses axe-core as an engine (see Lighthouse source code). Therefore it should not be treated as a second independent engine of validation in relation to the ratchet, which also uses the axe-core. The v2 audit found the same on available accessibility MCP servers (MCP is the protocol that connects tools to AI agents), and registered as a proposal to extend the turnstile instead of adding tools: the gate needs to be deterministic and run on GitHub Actions without an agent session. The findings of the audit v2 came from own probes and rules of good practice of the axe itself; the label in the name came from an external scanner, and the correction gained a test of its own.

Evidence: auditoria-v2.md, ADR-AV2-01 and ADR-AV2-02 (proposed) · GitHub Actions test workflow.

06 · Result

What the measurement shows today

Out of the 7 utilitarian pages except registered in EXCEPTIONS.md (internal, test and demonstration pages), the ratchet records 0 occurrences of Axe WCAG rules and structure probes, of minimum width, motion and spacing.

Axe rotates at 1280 px and leaves out third-party frames. YouTube player, embedded in 18 pages, has 58 failed elements that this measurement does not count.

98 occurrences of rules remain good practice Axe, as level jumps between titles, in 28 pages (Portuguese and English). They are not WCAG criteria, but they are locked in the ratchet and can only decrease. There are also 2 hidden text occurrences without JavaScript in life3d (English and Portuguese versions), a false positive recorded: they are layers of the game that are hidden until the game displays them, not content of the page.

Evidence: tests/a11y/baseline.json on 2026-10-05 · EXCEPTIONS.md.

Semantics

<main> and jump link on every page out of exceptions. Consent of cookies and OCC dialogues with <dialog> native; the curriculum modal leaves the rest of the page inert and returns the focus. Native buttons in place of div clickable, except in an in-house editor with exception.

Keyboard

Tested: tabs (14 groups), quiz, calibrator, dialogues, the fraction of the OCC simulator, consent and menu on the mobile phone. No focus trap on the 8 pages covered by Tab.

Focus

Ring #58a6ff of 2 px (7.49:1). Pixel difference checked on each 15-page Tab stop on Chromium. The focus is not hidden under the fixed header (tested on 6 of the 28 pages that have one) nor under the cookie banner, Chromium and Firefox.

Contrast

Solid pairs of color measured between 6,65:1 and 12,26:1, above the minimum of 4.5:1. Text on gradient, image or canvas is not decided by the axe: 2 447 elements were left unverified.

Movement

Partial treatment of prefers-reduced-motion: with active preference, the measurement did not find infinite CSS animation outside the exceptions, but the inventory and complete classification of animations remain pending. Without that preference, the background animation of the page Reverse Engineering Assisted by AI and the game The Journey in Pixel Art do not have pause control (open).

Reflow and zoom

At 320 px, only 2 pages excepted roll horizontally. No page blocks the zoom. Between 640 and 1024 px, 3 pages still roll horizontally (open). The 320 px wide test does not replace the 200% zoom validation. Not yet verified Text magnified to 200%.

Evidence: REPORT.md on 2026-10-05Sections 1, 2, 4 and 5 Current version of REPORT. md.

07 · Limits

What cannot be concluded

Absence of automatic error is not absence of barrier. The site's own history shows this twice:

  • With the green turnstile, the cookie banner covered 29 of the 131 Tab stops on the home page. It was the review by agent in a new context.
  • With green turnstile, an OCC simulator exercise could not be completed without mouse. The audit v2 found it.

What evidence allows us to affirm

Every statement, the evidence that exists and the state. "Undeclared" and "Unproven" are deliberate limits, not hidden pending.
Statement Evidence Status
The site has automated accessibility validationLocal Gate and CI on each pull request (quality-gate.mjs, test.yml)Proven
Gate-detectable occurrences decreasedRatchet reference recorded in each phase (table of section 04)Proven, with scope change in Phase 6
A11Y.md has been incorporated into the processdocs/a11y/, AGENTS.md, REPORT.mdProven
The site complies with WCAG 2.2 AAThere was no complete evaluation or human evaluation.Not declared
One person validated the site with screen readerNo test performedNot verified
Automation detects all barriersThe history itself shows flaws that the green turnstile did not seeNot shown
A11Y.md caused the reduction of occurrencesThere was no controlled experiment.Not shown
The site works with extended text to 200%Measured only at 320 px wide, and only what the gate measuresNot verified

Not checked or open

  • Limit Real screen reader: no reader and browser pair (e.g. NVDA with Firefox or VoiceOver with Safari) was used. What the dynamic (aria-live) regions announce has never been heard.
  • Limit Voice control: the name label was code tested; no one used Voice Control, Voice Access or Dragon.
  • Limit Safari: jump link and focus were not checked on it (Safari does not lead Tab to links in the default setting).
  • Limit Media: videos and audios without subtitles reviewed by person or transcribed verified. Not yet verified by human evaluation; the existence of technical mechanisms does not guarantee that the content is accessible.
  • Limit Movement: 118 infinite animations in 32 pages have not yet been classified as essential or decorative, and have no known pause mechanism.
  • Limit Language: the cookie warning and ecosystem menu have not been translated. On the English pages, their text remains in Portuguese, marked with the right language for the screen reader.
  • Limit Publication: The deploy doesn't wait for the gate to end. A regression can go on the air before the tests charge her.
  • Limit Independence: the only independent review was done by ai. No independent human evaluation was performed, and corrections made after Phase 7, of the c9d085c commit onward, were not reviewed again.

That's why the report stays in CONDITIONAL. Getting out of this status requires people: testing with real screen reader, human review of subtitles, decisions of the owner on the translation of the cookie notice and pause of the animations, and a new independent review, preferably by people and, in addition, by another model. And new components can bring new barriers: the ratchet prevents a count from rising, not that there is a problem that it does not measure.

Evidence: REPORT.md on 2026-10-05Sections 3 and 5 and Notes 3, 6 and 7 · auditoria-v2.md.

08 · The idea behind

From requirement to evidence

Accessibility should not be an inspection made after the interface is ready. Here it has become three concrete things: a text that the agent reads before writing code, a ratchet that prevents the count from getting worse and a report that says what no one has checked.

  1. Accessibility request
  2. Agent context
  3. Implementation
  4. Verification
  5. Evidence

It is the same logic of other pages of the method on this site: autonomy proportional to evidence, in Trust Engineering, and the website interface readable by agents in Agent Ready.

This page

It was written under the same rules: Native HTML, no specific JavaScript of this page (only the shared ecosystem menu), full content without script and measured by the same turnstile. Before publication, an agent in a new context, who received only A11Y.md and the page, audited accessibility, and another checked each statement against the repository. The result is in Current version of REPORT. md.

In short

Accessibility as a requirement, in few lines

Protocol A11Y. md entered the repository as context of the AI agents who write the code, and accessibility became measured to each pull request by a ratchet: an automatic measurement that fails any change that increases the failure count. The page shows the flow, the code of each change and what No one checked: the site report is in CONDITIONALBecause approval depends on tests only people can do.

  • Measurement — the first complete scan found 207 occurrences on 36 pages; outside the 7 utilitarian pages with the exception recorded, the occurrences detected by the automated gate reached zero. This does not mean absence of barriers, and the study does not isolate the effect of A11Y. md.
  • Independent review — an AI agent in a new context found faults that the green turnstile did not see; a second audit, done in the same work that corrected the findings, found others, as an impossible exercise to complete without mouse. No independent human evaluation has been made.
  • Limit — no person has tested the site with screen reader, voice control or Safari; the report declares the lowest level of independence, self-reported.

The idea is to Trust Engineering: an agent gains autonomy to the extent of the evidence he produces.

Frequently Asked Questions

Frequently Asked Questions

Is the site accessible?

The site's own verification report does not state this: the status is CONDITIONAL. With the exception of 7 utilitarian pages, the automatic measurement of the site records zero occurrences of WCAG Axe rules (without counting third-party iframes such as YouTube player) and structure probes, of minimum width, motion and spacing. But no person tested the site with screen reader, voice control or Safari, and the subtitles of the videos were not reviewed.

Which is A11Y. Md?

It is an open standard, MIT license, written for AI agents that generate interface. Defines a behavior contract for the agent, WCAG 2.2 compliance profiles, on-demand loaded component guides, decision records and exceptions, a report model and independent verification requirement. This site uses version 2.2.0, Standard profile (AA).

How was A11Y.md integrated into development with AI?

As a fixed copy in docs/a11y/, attached to a commit from the original repository. The main file is not loaded in every session because it would cost about 10,000 tokens; AGENTS.md has it applied to every interface edition and read only the guide of the component in question. The sub-reviewer of the repository has been updated to check pages against the protocol, and the quality gate measures the result for each pull request.

Is an automatic tool enough to validate accessibility?

It's not enough. The history of this site has two examples: with automatic measurement approving everything, the cookie banner covered 29 of the 131 Tab stops on the home page, and an OCC simulator exercise could not be completed without a mouse. The two failures were found by audits with their own probes, not by the axe. Screen reader, voice control and subtitles require people.