<?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: Felipe Arriaga Carriço</title>
    <description>The latest articles on DEV Community by Felipe Arriaga Carriço (@fecarrico).</description>
    <link>https://dev.to/fecarrico</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%2F4018366%2Fbd01666e-f2d1-475a-b3d9-e32b1e828a01.jpg</url>
      <title>DEV Community: Felipe Arriaga Carriço</title>
      <link>https://dev.to/fecarrico</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fecarrico"/>
    <language>en</language>
    <item>
      <title>Not every skill is a capability</title>
      <dc:creator>Felipe Arriaga Carriço</dc:creator>
      <pubDate>Fri, 07 Aug 2026 17:26:04 +0000</pubDate>
      <link>https://dev.to/fecarrico/not-every-skill-is-a-capability-43n9</link>
      <guid>https://dev.to/fecarrico/not-every-skill-is-a-capability-43n9</guid>
      <description>&lt;p&gt;Nobody installs the speed limit.&lt;/p&gt;

&lt;p&gt;You can add a GPS to your car, parking sensors, a backup camera, that thing that beeps when someone's in your blind spot. Those are capabilities: the car does something it couldn't do before, and each one matters exactly when you need it. Nobody turns on the backup camera to drive down a highway.&lt;/p&gt;

&lt;p&gt;Seatbelts and speed limits don't work that way. They aren't capabilities, they're constraints — they don't give you power, they take away options. And the difference becomes obvious the moment you imagine the alternative:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A seatbelt that fastens when you ask for safety isn't a seatbelt. It's a well-meaning ornament.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I kept that distinction because it explains a discomfort I couldn't name.&lt;/p&gt;

&lt;h2&gt;
  
  
  Skills, and the verb holding them up
&lt;/h2&gt;

&lt;p&gt;There's an open format called &lt;strong&gt;Agent Skills&lt;/strong&gt;, created by Anthropic and adopted by around forty AI coding tools. The idea is good and I'm a fan: a skill is a folder with an instructions file, plus optional references and scripts. The agent reads only the name and description of each skill at startup, and loads the full contents when the task &lt;strong&gt;matches&lt;/strong&gt; that description.&lt;/p&gt;

&lt;p&gt;It's well-designed context economy — an agent can have a hundred specialities on hand without carrying a hundred manuals at all times.&lt;/p&gt;

&lt;p&gt;Notice the verb holding the mechanism up: &lt;em&gt;matches&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;That works perfectly for capabilities. "How to generate a PDF", "how to write an integration test", "how to format a deck". These answer &lt;em&gt;how do I do X&lt;/em&gt;, and they only need to exist while someone is doing X.&lt;/p&gt;

&lt;h2&gt;
  
  
  The second kind of knowledge
&lt;/h2&gt;

&lt;p&gt;But there's a second kind of knowledge we've been packaging in the same format without noticing it's a different animal. The question it answers isn't &lt;em&gt;how do I do X&lt;/em&gt;. It's &lt;em&gt;what may I never do, whatever X turns out to be&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Accessibility is like that. So is security. So is data protection. They aren't abilities the agent reaches for when the subject comes up; they're conditions that hold before the subject exists.&lt;/p&gt;

&lt;p&gt;And the problem with treating them as capabilities is arithmetic, not philosophical: if the rule only loads when someone asks for accessibility, it arrives after the interface is built.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Accessibility that has to be asked for is already late.&lt;/strong&gt; That's the same old audit, now with a markdown file in the middle.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This isn't a comfortable desk hypothesis. The WebAIM Million analyses a million home pages every year, and in 2026 it recorded the first regression in six years: &lt;strong&gt;95.9% with detectable WCAG failures&lt;/strong&gt;, at the exact moment AI agents began writing much of the world's interface code.&lt;/p&gt;

&lt;p&gt;The models learned from the web that exists, and the web that exists is inaccessible. Their statistical default isn't neutral; it has a direction, and the direction is downhill. Against a slope like that, arriving at the right moment isn't an implementation detail. It's the whole thing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The convergence, and the one place it breaks
&lt;/h2&gt;

&lt;p&gt;I've spent the last few months building an open-source project called A11Y.md that does exactly that: a context file that injects accessibility rules into the agent before the first line of code.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/fecarrico" rel="noopener noreferrer"&gt;
        fecarrico
      &lt;/a&gt; / &lt;a href="https://github.com/fecarrico/A11Y.md" rel="noopener noreferrer"&gt;
        A11Y.md
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A context system for building accessible software by default — for developers and AI, with enforceable rules aligned to WCAG.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;p&gt;🇧🇷 Read in Portuguese: ./README.pt-BR.md&lt;/p&gt;
&lt;div&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/fecarrico/A11Y.md/./a11ymd.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Ffecarrico%2FA11Y.md%2FHEAD%2F.%2Fa11ymd.png" alt="Project A11Y.md Banner"&gt;&lt;/a&gt;
  &lt;br&gt;&lt;br&gt;
  &lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Project A11Y.md&lt;/h1&gt;
&lt;/div&gt;
  &lt;p&gt;&lt;b&gt;The Persistent Context System for Accessibility&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/fecarrico/A11Y.md#" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/dce947fecd52dd826b2c2d529f297fb13854bf722bfa152b475573658f707e42/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f574341472d322e325f41412d626c75652e737667" alt="WCAG 2.2 AA"&gt;&lt;/a&gt;
&lt;a href="https://github.com/fecarrico/A11Y.md#" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/b4d525549516280d72fb1372cf62c097f2813224dae1072ef9d2b571f66f3818/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f436f6d706c69616e63652d4144412532302537432532304541412d737563636573732e737667" alt="ADA Compliant"&gt;&lt;/a&gt;
&lt;a href="https://github.com/fecarrico/A11Y.md#" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/aff6ac72ff27cc70aafcb97de45ed00d8124ea1f572f0fb88fa9543cd198d462/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f436f6e746578742d41495f52656164792d707572706c652e737667" alt="AI Ready"&gt;&lt;/a&gt;
&lt;a href="https://github.com/fecarrico/A11Y.md#" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/478b61b8ae83a83ab6c78b62e64066078e0a000d92ac0e4e85f92eb922d5d841/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f416e7468726f7069632d436c617564655f666f725f4f70656e5f536f757263652d4439373735372e737667" alt="Claude for Open Source"&gt;&lt;/a&gt;&lt;/p&gt;
  &lt;br&gt;
  &lt;a href="https://github.com/fecarrico/A11Y.md/wiki" rel="noopener noreferrer"&gt;📖 Read the Official Wiki&lt;/a&gt; | &lt;a href="https://fecarrico.github.io/a11ymd/" rel="nofollow noopener noreferrer"&gt;🌐 Official Website&lt;/a&gt; | &lt;a href="https://open.substack.com/pub/felipearriadacarrio340730/p/a11ymd-accessibility-before-any-prompt" rel="nofollow noopener noreferrer"&gt;📝 Read the Manifesto (Substack)&lt;/a&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A11Y.md is not a guideline.&lt;/strong&gt;
It is an accessibility validation protocol and a &lt;strong&gt;persistent context architecture&lt;/strong&gt; for developing accessible software with AI. It is designed to integrate with AI agent systems (Cursor, Claude, Copilot) to ensure certifiable compliance from genesis.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;We treat &lt;code&gt;.gitignore&lt;/code&gt;, &lt;code&gt;eslint&lt;/code&gt;, and &lt;code&gt;CLAUDE.md&lt;/code&gt; as canonical truths in our repositories. But why isn't accessibility canonical? &lt;code&gt;A11Y.md&lt;/code&gt; translates accessibility rules into a portable governance layer: a &lt;strong&gt;platform-agnostic normative core&lt;/strong&gt; (POUR, compliance profiles, severity, governance) with &lt;strong&gt;mature web references&lt;/strong&gt; and a &lt;strong&gt;native translation layer&lt;/strong&gt; (iOS, Android, React Native, Flutter). Instead of generic coding advice, it forces any coding agent to strictly adhere to WCAG 2.2 AA and ADA standards from the very first line of generated UI code.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;⚡ Core&lt;/h2&gt;…&lt;/div&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/fecarrico/A11Y.md" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;When I finally sat down with the Agent Skills specification, I got a slightly funny shock — the architecture I'd designed was the same one, down to the folder names. References loaded on demand, instructions at the root, scripts alongside. Independent convergence, which is usually the best news a project can get: it means the design wasn't stubbornness, it was the answer the problem was asking for.&lt;/p&gt;

&lt;p&gt;And that's when the discomfort came into focus. My project fits the format entirely, except on one point: &lt;strong&gt;it can't wait for the task to match.&lt;/strong&gt; It has to be there while the agent still doesn't know what it's about to build, because that's precisely where the wrong decision gets made — the &lt;code&gt;div&lt;/code&gt; that became a button, the input with no label, the modal that traps the keyboard.&lt;/p&gt;

&lt;p&gt;None of those come from a task called "accessibility". They all come from a task called "build a signup form".&lt;/p&gt;

&lt;h2&gt;
  
  
  The ecosystem already knows. It just hasn't named it.
&lt;/h2&gt;

&lt;p&gt;Here's the part I didn't expect to find when I read the specs closely. Every extension the clients have added moves activation in the &lt;strong&gt;restrictive&lt;/strong&gt; direction — never the permanent one:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Client&lt;/th&gt;
&lt;th&gt;Field they added&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cursor&lt;/td&gt;
&lt;td&gt;&lt;code&gt;disable-model-invocation&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;runs only when you type its name&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Code&lt;/td&gt;
&lt;td&gt;&lt;code&gt;disable-model-invocation&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;same&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Code&lt;/td&gt;
&lt;td&gt;&lt;code&gt;paths&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;narrows activation to matching files&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;The spec itself&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;six fields, none of them&lt;/td&gt;
&lt;td&gt;keeps a skill loaded&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Nobody added the reverse, because the reverse isn't a skill.&lt;/p&gt;

&lt;p&gt;The prettiest proof is Cursor's migration tool, which converts old rules into the new format. It converts the dynamic ones — the rules that apply in certain situations. And it refuses to convert the ones marked always-apply, because those, in its own documentation's words:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;retain explicit triggering conditions that differ from skill behavior&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So always-on context does exist. It just lives outside the portable format, in each tool's proprietary layer — the rule files you have to rewrite for every client you support. Which means today's authors choose between:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Portability&lt;/strong&gt; — one skill, forty tools, one install.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Guaranteed presence&lt;/strong&gt; — one rule file per client, N times over.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Constraints are precisely the case where that trade-off hurts most.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two words where we have one
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Capability skills&lt;/th&gt;
&lt;th&gt;Constraint skills&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Answer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;how do I do X&lt;/td&gt;
&lt;td&gt;what may I never do&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Activate&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;by subject&lt;/td&gt;
&lt;td&gt;across a whole domain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;How many&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;many, the more the better&lt;/td&gt;
&lt;td&gt;few, or they stop being constraints&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Failure mode&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;loads when it isn't needed&lt;/td&gt;
&lt;td&gt;doesn't load when it is&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A capability that stays quiet when nobody calls it is working correctly. A constraint that stays quiet is broken — and looks identical from the outside.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you can do today
&lt;/h2&gt;

&lt;p&gt;The good news is the format handles both. What doesn't handle both is the mental model of activation. And there's a practical workaround that fits in one line: &lt;strong&gt;write your constraint skill's description by domain, never by desire.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# By desire — guarantees absence at the moment that matters&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Use when the user asks about accessibility.&lt;/span&gt;

&lt;span class="c1"&gt;# By domain — the rule exists before anyone thinks to ask&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Use whenever creating or modifying any UI, component,&lt;/span&gt;
  &lt;span class="s"&gt;or front-end code.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Change one sentence, change when the rule exists. It's a patch, and a good one — but still a patch on a model that assumes everything we package is an ability.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this goes
&lt;/h2&gt;

&lt;p&gt;I'm not proposing a new standard, and I'm not complaining about the one we have. I adopted the format, it's good, and the industry just converged around it — Vercel, Amazon, Microsoft, OpenAI, Cursor and Google closed a packaging layer on top of it days ago.&lt;/p&gt;

&lt;p&gt;When a space consolidates like that, arguing about vocabulary stops being pedantry and becomes infrastructure: the difference between "install the seatbelt when you want safety" and "the seatbelt comes fastened" is a design decision someone makes once and everyone inherits.&lt;/p&gt;

&lt;p&gt;I took the question to the spec repository, where it belongs — &lt;a href="https://github.com/agentskills/agentskills/discussions/484" rel="noopener noreferrer"&gt;discussion #484&lt;/a&gt;, if you'd like to argue with me there.&lt;/p&gt;

&lt;p&gt;So, for the people building agents and the people writing specs: when the thing being packaged is a prohibition rather than an ability, is loading it on demand still the right call — or are we applying context economy exactly where it costs the most?&lt;/p&gt;

&lt;p&gt;In the meantime, go check your skills' descriptions. That one line nobody reads is what decides whether the rule shows up before or after the damage.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>a11y</category>
      <category>webdev</category>
      <category>architecture</category>
    </item>
    <item>
      <title>A11Y.md: Accessibility before any prompt</title>
      <dc:creator>Felipe Arriaga Carriço</dc:creator>
      <pubDate>Mon, 06 Jul 2026 20:49:01 +0000</pubDate>
      <link>https://dev.to/fecarrico/a11ymd-accessibility-before-any-prompt-1ige</link>
      <guid>https://dev.to/fecarrico/a11ymd-accessibility-before-any-prompt-1ige</guid>
      <description>&lt;h3&gt;
  
  
  And if accessibility wasn't something you simply validate, but something the system already knows?
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://substackcdn.com/image/fetch/$s_!rgOD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b94227c-c478-4524-a373-5b6f9f00e00c_800x450.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwpix95hq6az8bspijxyc.png" alt="A11Y.md project logo in a retro computer screen style. The text reads 'A11Y.md — The Persistent Context System for Accessibility' in coral tones on a black background." width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If context defines AI behavior, then accessibility needs to be part of that DNA from the very first prompt.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is the simple — and necessary — premise behind &lt;strong&gt;A&lt;a href="https://github.com/fecarrico/A11Y.md" rel="noopener noreferrer"&gt;11Y.md&lt;/a&gt;&lt;/strong&gt;: a configuration file that acts as the accessibility “conscience” of your project, guiding code agents to follow inclusive standards automatically and organically.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;&lt;a href="https://v0-projecta11y.vercel.app/" rel="noopener noreferrer"&gt;Project A11Y.md&lt;/a&gt;&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;A context system for building accessible software by default — for developers and AI, with enforceable rules aligned to WCAG.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Inspired by the &lt;em&gt;CLAUDE.md&lt;/em&gt; file model, it is not meant to be just another best practices guide or an infinite checklist, but rather a validation protocol and a persistent context architecture for AI agents that generate code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A11Y.md&lt;/strong&gt; is a common abbreviation for &lt;em&gt;accessibility&lt;/em&gt;: between the “A” and the “Y”, there are 11 letters (&lt;em&gt;ccessibilit&lt;/em&gt;). But there’s an interesting detail: it can also be read as “&lt;strong&gt;ally&lt;/strong&gt;“. An ally. And that is exactly what this project sets out to be.&lt;/p&gt;

&lt;p&gt;­&lt;/p&gt;

&lt;p&gt;&lt;a href="https://substackcdn.com/image/fetch/$s_!MyHj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8aa9164-316d-4be7-8dea-21dbb5d6fd57_800x220.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuuqbkx3ayw005gskrtat.png" alt="Text in a retro computer screen style, in coral tones on a green background: " width="800" height="220"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The discomfort: two parallel worlds&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;During a conversation about accessibility in the Community Lounge at the TDC Summit AI São Paulo 2026, where I am a coordinator, I perceived a chasm.&lt;/p&gt;

&lt;p&gt;On one side, certification and legal compliance — necessary, but slow. On the other, &lt;em&gt;vibe coding&lt;/em&gt; and AI generating interfaces at an absurd speed. The result?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;We are scaling digital exclusion faster than ever.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The question has changed: &lt;em&gt;Who is left out when the AI works, but isn’t accessible?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;­&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Reactive accessibility starts too late&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Today, accessibility is treated as the final stage of the pipeline:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You design,&lt;/li&gt;
&lt;li&gt;You develop (or the AI develops),&lt;/li&gt;
&lt;li&gt;Then, you validate.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;At this pace of agents and copilots, the error has already scaled before we even open the validator. If accessibility only enters at the end, it will never reach the speed of innovation.&lt;/p&gt;

&lt;p&gt;­&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;From checklist to a context ally&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;We treat accessibility as a to-do list: &lt;em&gt;Is there contrast? Is there a label?&lt;/em&gt; But anyone working with LLMs already understands the game: the model doesn't follow rules, it follows context. Without context, the AI improvises. And improvisation in accessibility is the recipe for exclusion.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If we don’t provide the base context, the AI will prefer the visually “beautiful” path over the functionally “inclusive” one.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;­&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What the audit reveals (real examples)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;To understand the impact of missing context, see what happens in interfaces that “look” correct but are unoperable.&lt;/p&gt;

&lt;p&gt;The following examples were generated from a recent project I worked on using &lt;em&gt;Figma Make&lt;/em&gt; and &lt;em&gt;Antigravity (Gemini 3 Flash)&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;The code blocks with errors were already present in the project, and the improvement suggestions were generated by using &lt;strong&gt;A11Y.md&lt;/strong&gt; as a reviewer:­&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;1. The fake button&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://substackcdn.com/image/fetch/$s_!DEFi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2193a7f4-6b90-4c30-853a-1aa0f3cbbb10_800x450.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjcf7qyzlxut08bbq9k2u.png" alt="Two identical buttons side by side. Above the left one, we see a muted audio icon, and below it, the code snippet div. Above the right one, we see a working audio icon, and below it, the code snippet button." width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It is common to see AI generating clickable elements using &lt;code&gt;div&lt;/code&gt;. Visually it works, but in practice, you have created an element invisible to keyboard and screen readers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The common error (works… for mouse users)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;div onClick={() =&amp;gt; navigate('/components')}&amp;gt;
  Explore Components
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;­ &lt;strong&gt;The problem&lt;/strong&gt;   &lt;/p&gt;

&lt;p&gt;This element:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does not receive keyboard focus,&lt;/li&gt;
&lt;li&gt;Does not respond to Enter or Space,&lt;/li&gt;
&lt;li&gt;Is not announced as interactive by screen readers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In other words: it is not a button; it only looks like one.&lt;br&gt;&lt;br&gt;
­&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The contextualized correction&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;button onClick={() =&amp;gt; navigate('/components')}&amp;gt;
  Explore Components
&amp;lt;/button&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;­ &lt;strong&gt;Why this is better:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Native focus,&lt;/li&gt;
&lt;li&gt;Automatic keyboard support,&lt;/li&gt;
&lt;li&gt;Semantic recognition by assistive technologies.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You didn’t add accessibility. You just stopped breaking the browser’s default behavior.&lt;/p&gt;

&lt;p&gt;­&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;2. Typography is not aesthetics, it’s access&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://substackcdn.com/image/fetch/$s_!fRQw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d79614b-bc96-4357-8adb-674dc23f0c70_800x447.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2s67i5mqvu897knrmlnh.png" alt="Two text boxes side by side. On the left, small text reads: " width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;“Minimalism” often demands an invisible price: &lt;em&gt;legibility&lt;/em&gt;. Fonts that are too small may look elegant, until you try to read them in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A low-light environment,&lt;/li&gt;
&lt;li&gt;A phone in the sun,&lt;/li&gt;
&lt;li&gt;Or with any level of low vision.
­&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The error&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;p className="text-[10px]"&amp;gt;
  Important information, but unreadable.
&amp;lt;/p&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;­&lt;br&gt;&lt;br&gt;
&lt;strong&gt;The problem&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Below 12px, you begin to significantly compromise readability. It's not a preference; it's a physiological limitation.&lt;br&gt;&lt;br&gt;
­&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The correction:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;p className="text-xs"&amp;gt;
  Legibility is not a detail, it's a condition of use.
&amp;lt;/p&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;­&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Why this is better:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Maintains a functional minimum for reading,&lt;/li&gt;
&lt;li&gt;Reduces cognitive effort,&lt;/li&gt;
&lt;li&gt;Avoids relying exclusively on zoom or user adjustments.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the layout needs to be dense, the solution is to improve hierarchy and contrast.&lt;/p&gt;

&lt;p&gt;­&lt;/p&gt;
&lt;h4&gt;
  
  
  &lt;strong&gt;3. Silent forms&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://substackcdn.com/image/fetch/$s_!Mwnb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43d3b123-4886-4135-a50a-3e0db5b116cd_800x450.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjf58iu83kqpp2curpr22.png" alt="Two email forms side by side. On the left, the label " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The error&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;label&amp;gt;Email&amp;lt;/label&amp;gt;
&amp;lt;input type="email" /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;­ &lt;strong&gt;The problem&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Screen readers allow direct navigation between form fields, ignoring surrounding content. When the input is not associated with the label, it loses its accessible name.&lt;/p&gt;

&lt;p&gt;The user arrives at the field, but doesn’t know what it represents. Because for assistive technologies, visual proximity means nothing; only explicit relationships in the code matter.&lt;br&gt;&lt;br&gt;
­&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The correction&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;label htmlFor="email"&amp;gt;Email&amp;lt;/label&amp;gt;
&amp;lt;input id="email" type="email" /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;­ &lt;strong&gt;Why this is better:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creates an explicit semantic link,&lt;/li&gt;
&lt;li&gt;Allows the field to be announced correctly,&lt;/li&gt;
&lt;li&gt;Improves form navigation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here, it’s not a matter of “good practice,” but about interface comprehension.&lt;/p&gt;

&lt;p&gt;­&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;4. Feedback no one hears&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://substackcdn.com/image/fetch/$s_!Ghwz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed21780b-3d88-4e9b-9c27-9954cc379ab0_800x450.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqv6log78ux8fau6lw3d6.png" alt="Two identical interface alerts side by side. On the left, we read " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Modern interfaces are full of dynamic states: errors, successes, alerts. But there is one detail: not every visual change is perceived by assistive technologies.&lt;/p&gt;

&lt;p&gt;­&lt;br&gt;&lt;br&gt;
&lt;strong&gt;The error&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{error &amp;amp;&amp;amp; (
  &amp;lt;div className="p-3 bg-red-100 text-red-700"&amp;gt;
    {error}
  &amp;lt;/div&amp;gt;
)}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;­&lt;br&gt;&lt;br&gt;
&lt;strong&gt;The problem&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The message appears on screen, but is not announced. For a screen reader, nothing happened.&lt;br&gt;&lt;br&gt;
­&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The correction&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{error &amp;amp;&amp;amp; (
  &amp;lt;div role="alert" aria-live="assertive"&amp;gt;
    {error}
  &amp;lt;/div&amp;gt;
)}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;­&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Why this is better:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Immediately informs state changes,&lt;/li&gt;
&lt;li&gt;Ensures errors are not overlooked,&lt;/li&gt;
&lt;li&gt;Maintains consistency between what is seen and what is perceived.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;­&lt;/p&gt;

&lt;p&gt;&lt;a href="https://substackcdn.com/image/fetch/$s_!8JIk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01a5e65a-902e-4967-beed-57116073467e_800x162.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foztratw4qwtmbcmuzzl5.png" alt="Text in a retro computer screen style, in coral tones on a green background: " width="800" height="162"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The A11Y.md Paradigm&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The point is not the isolated examples, but that they continue to happen because they depend on human memory in accelerated environments. &lt;strong&gt;A11Y.md&lt;/strong&gt; proposes three pillars:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Human-Centric:&lt;/strong&gt; Focus on the user’s real autonomy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI-Ready:&lt;/strong&gt; Guidelines written to guide code agents.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Certifiable:&lt;/strong&gt; Rules mapped directly to the WCAG 2.2 standard.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If the code agent (or your editor in &lt;em&gt;Vibe Coding&lt;/em&gt; mode) already “reads” in the project context that it is forbidden to use &lt;code&gt;div&lt;/code&gt; as a button or generate text below 12px, the error ceases to be an option.&lt;/p&gt;

&lt;p&gt;­&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;AI won’t solve (alone) accessibility&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Let’s be realistic: AI won’t “solve” accessibility. Accessibility is experience. It’s the look of someone who perceives colors, the touch of someone who navigates without a mouse, the listening of someone who depends on voice.&lt;/p&gt;

&lt;p&gt;The human remains indispensable. &lt;strong&gt;A11Y.md&lt;/strong&gt; does not replace us; it guarantees that the basics are not neglected so we can focus on what really matters: the exceptional human experience.&lt;/p&gt;

&lt;p&gt;­&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;To use A11Y.md is simple:&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://substackcdn.com/image/fetch/$s_!IwiN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ef566f7-a5a2-4fd3-82eb-40d417a1e7ff_800x361.gif" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbbbw62r1p1w814dtn8p6.gif" alt="Gif demonstrating the configuration of the A11Y.md file in Antigravity." width="800" height="361"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/fecarrico/A11Y.md" rel="noopener noreferrer"&gt;Download the rules&lt;/a&gt;&lt;/strong&gt; &lt;a href="https://github.com/fecarrico/A11Y.md" rel="noopener noreferrer"&gt;from the official Github repository:&lt;/a&gt; Copy the content from the &lt;code&gt;/docs/pt-BR&lt;/code&gt; folder (or the English version as a good practice) to the root of your project repository.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inject into the prompt:&lt;/strong&gt; If you use &lt;em&gt;Cursor&lt;/em&gt;, &lt;em&gt;GitHub Copilot&lt;/em&gt;, &lt;em&gt;Claude&lt;/em&gt;, or &lt;em&gt;Antigravity&lt;/em&gt;, add to your global rules file (&lt;code&gt;.cursorrules&lt;/code&gt;, &lt;code&gt;GEMINI.md&lt;/code&gt;, or any other context system): &lt;em&gt;“When developing interfaces, strictly follow the development rules defined in the A11Y.md file.”&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Call it directly:&lt;/strong&gt; You can also call &lt;strong&gt;A11Y.md&lt;/strong&gt; at any time directly in your agent: &lt;em&gt;“Analyze the project (which can be existing code or a Figma screen using MCP) using A11Y.md.”&lt;/em&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;By doing this, your development environment will know — from the beginning — that accessibility is a basic requirement in code generation.&lt;/p&gt;

&lt;p&gt;­&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;An invitation to Open Source&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;A11Y.md&lt;/strong&gt; is not just a file; it's a starting point. It can become an IDE plugin, a CI/CD pipeline, or a specialized agent. The project is open source (MIT license) because accessibility does not ask for permission; it asks for collaboration.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Accessibility cannot be a seal at the end of the process. It needs to be the restriction at the beginning.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Maybe the next step in accessibility is, finally, to become practical and accessible for those building the future, whether human or not.&lt;/p&gt;




&lt;h4&gt;
  
  
  References and inspirations
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;&lt;a href="https://claude.com/blog/using-claude-md-files" rel="noopener noreferrer"&gt;Using CLAUDE.md files: Customizing Claude Code for your codebase&lt;/a&gt;&lt;/em&gt; — Claude&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;&lt;a href="https://github.com/mneves75/ai-health-sync-ios/blob/master/DOCS/ACCESSIBILITY.md" rel="noopener noreferrer"&gt;ACCESSIBILITY.md&lt;/a&gt;&lt;/em&gt;— mneves75&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;&lt;a href="https://github.com/redwoodjs/graphql/blob/main/docs/docs/a11y.md" rel="noopener noreferrer"&gt;a11y.md&lt;/a&gt;&lt;/em&gt; — RedwoodGraphQL&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;&lt;a href="https://antigravity.codes/blog/user-rules" rel="noopener noreferrer"&gt;Antigravity Rules: Guide with AGENTS.md &amp;amp; Examples&lt;/a&gt;&lt;/em&gt;— Antigravity Codes&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://brasil.uxdesign.cc/a11y-md-acessibilidade-antes-de-qualquer-prompt-5c8778ccb310" rel="noopener noreferrer"&gt;Original articule in Portuguese&lt;/a&gt; - Felipe A. Carriço&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>a11y</category>
      <category>frontend</category>
      <category>uxdesign</category>
    </item>
  </channel>
</rss>
