<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<p>This is awesome; thank you for doing it. How much of a difference
have you found?</p>
<p>My problem does tend to be context windows as you mentioned with
the drifting, but the secondary issue is that AI was trained on a
load of horrible data, so it tends to make terrible accessibility
decisions. One of the more fun vibe-coded accessibility issues I'm
stumbling on lately is adding aria-haspopup to everything.</p>
<p><br>
</p>
<div class="moz-signature">
<div>
<p>
<strong>Ty Littlefield (he/him/his)</strong><br>
</p>
<ul>
<li> <a href="https://tysdomain.com" target="_blank">From
Bytes to Bites</a>|
</li>
<li><a href="https://www.linkedin.com/in/ty-lerlittlefield/">Linkedin</a></li>
</ul>
</div>
</div>
<div class="moz-cite-prefix">On 2/22/2026 1:54 PM, dandrews920---
via NFBCS wrote:<br>
</div>
<blockquote type="cite"
cite="mid:3bec01dca43d$674f68d0$35ee3a70$@comcast.net">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="Generator"
content="Microsoft Word 15 (filtered medium)">
<!--[if !mso]><style>v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style><![endif]-->
<style><!--
/* Font Definitions */
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:Aptos;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0in;
font-size:12.0pt;
font-family:"Aptos",sans-serif;}
h1
{mso-style-priority:9;
mso-style-link:"Heading 1 Char";
mso-margin-top-alt:auto;
margin-right:0in;
mso-margin-bottom-alt:auto;
margin-left:0in;
font-size:24.0pt;
font-family:"Aptos",sans-serif;
font-weight:bold;}
h2
{mso-style-priority:9;
mso-style-link:"Heading 2 Char";
mso-margin-top-alt:auto;
margin-right:0in;
mso-margin-bottom-alt:auto;
margin-left:0in;
font-size:18.0pt;
font-family:"Aptos",sans-serif;
font-weight:bold;}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:blue;
text-decoration:underline;}
span.Heading1Char
{mso-style-name:"Heading 1 Char";
mso-style-priority:9;
mso-style-link:"Heading 1";
font-family:"Aptos Display",sans-serif;
color:#0F4761;}
span.Heading2Char
{mso-style-name:"Heading 2 Char";
mso-style-priority:9;
mso-style-link:"Heading 2";
font-family:"Aptos Display",sans-serif;
color:#0F4761;}
.MsoChpDefault
{mso-style-type:export-only;
font-size:10.0pt;
mso-ligatures:none;}
@page WordSection1
{size:8.5in 11.0in;
margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
{page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
<div class="WordSection1">
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p>Taylor\u2019s Substack - Friday, February 20, 2026 at 8:39<span
style="font-family:"Arial",sans-serif">\u202f</span>PM<o:p></o:p></p>
<h1>I Got Fed Up With AI Forgetting Accessibility, So I Built
a Team That Will Not<o:p></o:p></h1>
<div>
<p class="MsoNormal"><img width="920" height="480"
style="width:9.5833in;height:5.0in" id="_x0000_i1025"
src="https://substackcdn.com/image/fetch/$s_!RcQU!,f_auto,q_auto:best,fl_progressive:steep/https%3A%2F%2Ftaylorarndt.substack.com%2Ftwitter%2Fsubscribe-card.jpg%3Fv%3D-888026622%26version%3D9"
moz-do-not-send="true"><o:p></o:p></p>
</div>
<p>It is Friday night. I had a long day at work coding with
Claude, and I am talking to some friends of mine. I have had
it.<o:p></o:p></p>
<p>AI tools do not care about accessibility. And I finally did
something about it.<o:p></o:p></p>
<div>
<div>
<div>
<p>Taylor\u2019s Substack is a reader-supported publication.
To receive new posts and support my work, consider
becoming a free or paid subscriber.<o:p></o:p></p>
</div>
</div>
</div>
<h2>The Frustration <o:p></o:p></h2>
<p>I use AI coding tools every day. Claude Code is a core part
of how I work. I have written about this before. AI helps me
stay organized, keep context, and build things faster than
my brain would allow on its own. It is genuinely one of the
most important tools in my workflow.<o:p></o:p></p>
<p>But there is a problem. A big one.<o:p></o:p></p>
<p>AI tools are terrible at accessibility.<o:p></o:p></p>
<p>I do not mean they are bad sometimes. I mean they are
consistently, reliably, predictably bad at it. Every single
time I ask an AI to build a component, I have to fight for
the basics. Label your inputs. Trap focus in the modal. Do
not use a div when a button exists. Make sure this contrast
ratio actually passes. Add a live region so the screen
reader knows something changed.<o:p></o:p></p>
<p>These are not advanced requirements. These are the
fundamentals. And AI drops them constantly.<o:p></o:p></p>
<h2>Why This Hits Different for Me <o:p></o:p></h2>
<p>I am a screen reader user. When AI generates a modal
without focus trapping, I am the person who gets stuck. When
it skips live regions on search results, I am the person who
hears nothing. When it uses a div with an onClick instead of
a button, I am the person who cannot activate it with my
keyboard.<o:p></o:p></p>
<p>I am not reviewing accessibility as an abstract checklist.
I am living it. Every failure that ships is a wall I
personally hit.<o:p></o:p></p>
<p>And the worst part is that I know better. I am an
accessibility specialist. I have the knowledge to catch
these issues. But I should not have to catch them every
single time. The tools should know this already.<o:p></o:p></p>
<h2>What I Tried First <o:p></o:p></h2>
<p>I tried the obvious things. I wrote detailed instructions
in CLAUDE.md files. I created skills with accessibility
rules. I added reminders to my prompts.<o:p></o:p></p>
<p>None of it stuck.<o:p></o:p></p>
<p>Skills in Claude Code activate maybe twenty percent of the
time without manual intervention. Instructions in context
files work at first, but as the conversation grows, they
drift. The model deprioritizes them. It decides other things
matter more. Accessibility gets quietly dropped from the
plan.<o:p></o:p></p>
<p>That is the pattern. Not malicious. Not intentional. Just
gone. Every time.<o:p></o:p></p>
<h2>So I Built a Team <o:p></o:p></h2>
<p>I stopped trying to remind one model to care about
accessibility. Instead, I built six specialized agents, each
with a single focused job they cannot ignore.<o:p></o:p></p>
<p>There is an Accessibility Lead that orchestrates the team
and decides which specialists are needed. There is an ARIA
Specialist that enforces correct roles, states, and
properties. There is a Modal Specialist that owns focus
trapping, focus return, and escape behavior. There is a
Contrast Master that checks every color combination against
WCAG AA ratios. There is a Keyboard Navigator that ensures
everything can be reached and operated without a mouse. And
there is a Live Region Controller that bridges the gap
between visual updates and screen reader awareness.<o:p></o:p></p>
<p>Each agent has its own context window. Its own system
prompt. Its own identity. The ARIA specialist cannot forget
about ARIA because ARIA is who it is. The contrast master
cannot skip contrast checks because that is its entire
purpose.<o:p></o:p></p>
<p>A hook fires on every prompt I send to Claude Code. If the
task involves UI code, the Accessibility Lead activates and
coordinates the right specialists. If it does not involve
UI, the hook is ignored and Claude works normally.<o:p></o:p></p>
<h2>Why Agents Instead of Everything Else <o:p></o:p></h2>
<p>I tried skills. They get ignored.<o:p></o:p></p>
<p>I tried MCP servers. They add tool calls but do not change
how the model reasons about code.<o:p></o:p></p>
<p>I tried detailed instructions. They drift out of context.<o:p></o:p></p>
<p>Agents are different. They run in their own window with
their own rules. The rules are not suggestions. They are the
agent\u2019s entire identity. That is the difference. A
suggestion can be deprioritized. An identity cannot.<o:p></o:p></p>
<h2>What It Covers <o:p></o:p></h2>
<p>The team enforces WCAG 2.1 Level AA compliance. That
includes screen reader compatibility across VoiceOver, NVDA,
and JAWS. Keyboard-only navigation. Focus management for
single-page apps, modals, and dynamic content. Color
contrast verification with actual ratio calculation. Live
region implementation for toasts, search results, loading
states, and form feedback. Semantic HTML enforcement. And
common framework pitfalls like React conditional rendering
breaking live regions and Tailwind color classes failing
contrast.<o:p></o:p></p>
<p>That is a lot. And it should be. Because accessibility is a
lot.<o:p></o:p></p>
<h2>It Is Open Source <o:p></o:p></h2>
<p>I built this for the community. It is free. It is MIT
licensed. Anyone using Claude Code can install it in about
thirty seconds.<o:p></o:p></p>
<p>The installer asks if you want it at the project level or
globally. It works on macOS, Linux, and Windows. It even has
an auto-update system that checks GitHub daily for
improvements.<o:p></o:p></p>
<p>Here is the repo: <a
href="https://github.com/taylorarndt/a11y-agent-team"
moz-do-not-send="true" class="moz-txt-link-freetext">https://github.com/taylorarndt/a11y-agent-team</a><o:p></o:p></p>
<h2>This Is a Preview <o:p></o:p></h2>
<p>I am still testing. I am still refining the agents. I am
still finding gaps and fixing them. This is not a finished
product announcement. This is a preview. I wanted to share
it early because accessibility should not wait for a
polished launch.<o:p></o:p></p>
<p>If you try it and something is missing, open an issue. If a
pattern gets overlooked, tell me. If you work with a
framework that has specific gotchas, contribute. This is a
community project and it will get better with more eyes on
it.<o:p></o:p></p>
<h2>Why I Care This Much <o:p></o:p></h2>
<p>I use assistive technology every day. Accessibility is not
a feature I advocate for. It is how I experience the
internet. Every inaccessible component is a door that does
not open for me. Every missing label is a form I cannot fill
out. Every broken modal is a trap I have to escape from.<o:p></o:p></p>
<p>AI tools should make the web more accessible, not less.
They generate code at a speed and scale that humans never
could. If that code is inaccessible by default, the problem
is not getting smaller. It is getting bigger. Fast.<o:p></o:p></p>
<p>That is why I built this. Not because it is a cool project.
Because I need it. And I am not the only one.<o:p></o:p></p>
<p>If you want to support this, star the repo and watch it for
updates. If you find gaps, open an issue. If you have ideas
or framework-specific patterns to add, feel free to
contribute. This is a community project. The more people
involved, the better it gets.<o:p></o:p></p>
<p>Here is the repo one more time: <a
href="https://github.com/taylorarndt/a11y-agent-team"
moz-do-not-send="true" class="moz-txt-link-freetext">https://github.com/taylorarndt/a11y-agent-team</a><o:p></o:p></p>
<p>Thank you for reading. More updates coming as the agents
improve.<o:p></o:p></p>
<div>
<div>
<div>
<p>Taylor\u2019s Substack is a reader-supported publication.
To receive new posts and support my work, consider
becoming a free or paid subscriber.<o:p></o:p></p>
</div>
</div>
</div>
<p><a
href="https://taylorarndt.substack.com/p/i-got-fed-up-with-ai-forgetting-accessibility"
moz-do-not-send="true" class="moz-txt-link-freetext">https://taylorarndt.substack.com/p/i-got-fed-up-with-ai-forgetting-accessibility</a><o:p></o:p></p>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal"> <span style="color:white"><o:p></o:p></span></p>
</div>
</div>
<br>
<fieldset class="moz-mime-attachment-header"></fieldset>
<pre wrap="" class="moz-quote-pre">_______________________________________________
NFBCS mailing list
<a class="moz-txt-link-abbreviated" href="mailto:NFBCS@nfbnet.org">NFBCS@nfbnet.org</a>
<a class="moz-txt-link-freetext" href="http://nfbnet.org/mailman/listinfo/nfbcs_nfbnet.org">http://nfbnet.org/mailman/listinfo/nfbcs_nfbnet.org</a>
To unsubscribe, change your list options or get your account info for NFBCS:
<a class="moz-txt-link-freetext" href="http://nfbnet.org/mailman/options/nfbcs_nfbnet.org/tyler%40tysdomain.com">http://nfbnet.org/mailman/options/nfbcs_nfbnet.org/tyler%40tysdomain.com</a>
</pre>
</blockquote>
</body>
</html>