<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<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:Wingdings;
panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
{font-family:Aptos;
panose-1:0 0 0 0 0 0 0 0 0 0;}
@font-face
{font-family:"Aptos Display";
panose-1:0 0 0 0 0 0 0 0 0 0;}
@font-face
{font-family:Consolas;
panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0in;
font-size:12.0pt;
font-family:"Aptos",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",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",serif;
font-weight:bold;}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:blue;
text-decoration:underline;}
pre
{mso-style-priority:99;
mso-style-link:"HTML Preformatted Char";
margin:0in;
font-size:10.0pt;
font-family:"Courier New";}
span.Heading1Char
{mso-style-name:"Heading 1 Char";
mso-style-priority:9;
mso-style-link:"Heading 1";
font-family:"Aptos Display",serif;
color:#0F4761;}
span.Heading2Char
{mso-style-name:"Heading 2 Char";
mso-style-priority:9;
mso-style-link:"Heading 2";
font-family:"Aptos Display",serif;
color:#0F4761;}
span.HTMLPreformattedChar
{mso-style-name:"HTML Preformatted Char";
mso-style-priority:99;
mso-style-link:"HTML Preformatted";
font-family:Consolas;}
span.EmailStyle24
{mso-style-type:personal-reply;
font-family:"Aptos",serif;
color:windowtext;}
.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;}
/* List Definitions */
@list l0
{mso-list-id:800348204;
mso-list-template-ids:-1224817284;}
@list l0:level1
{mso-level-number-format:bullet;
mso-level-text:\uf0b7;
mso-level-tab-stop:.5in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Symbol;}
@list l0:level2
{mso-level-number-format:bullet;
mso-level-text:o;
mso-level-tab-stop:1.0in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:"Courier New";
mso-bidi-font-family:"Times New Roman";}
@list l0:level3
{mso-level-number-format:bullet;
mso-level-text:\uf0a7;
mso-level-tab-stop:1.5in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l0:level4
{mso-level-number-format:bullet;
mso-level-text:\uf0a7;
mso-level-tab-stop:2.0in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l0:level5
{mso-level-number-format:bullet;
mso-level-text:\uf0a7;
mso-level-tab-stop:2.5in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l0:level6
{mso-level-number-format:bullet;
mso-level-text:\uf0a7;
mso-level-tab-stop:3.0in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l0:level7
{mso-level-number-format:bullet;
mso-level-text:\uf0a7;
mso-level-tab-stop:3.5in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l0:level8
{mso-level-number-format:bullet;
mso-level-text:\uf0a7;
mso-level-tab-stop:4.0in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l0:level9
{mso-level-number-format:bullet;
mso-level-text:\uf0a7;
mso-level-tab-stop:4.5in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
ol
{margin-bottom:0in;}
ul
{margin-bottom:0in;}
--></style>
</head>
<body lang="EN-US" link="blue" vlink="purple" style="word-wrap:break-word">
<div class="WordSection1">
<p class="MsoNormal">Thank you Taylor for sharing this! <o:p></o:p></p>
<p class="MsoNormal">I am wondering, will this team of agents be deployed in other AI GPTs other thanClaude?
<o:p></o:p></p>
<p class="MsoNormal">Do you need a paid Claude account to use Code projects and these different types of agents?
<o:p></o:p></p>
<p class="MsoNormal">I have been recently getting intofibe-coding myself, just as a hobby. And I really like it, but I run into the same problem from time to time with non-accessible code, and I have to check the stuff manually.
<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Thanks! <o:p></o:p></p>
<p class="MsoNormal">Humberto<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal"><a href="https://www.freedomscientific.com/Training/Certification"><span style="color:windowtext;text-decoration:none"><img border="0" width="86" height="86" style="width:.8958in;height:.8958in" id="Picture_x0020_1792853622" src="cid:image001.png@01DCA403.BF31C780" alt="JAWS Certified, 2025"></span></a><span style="mso-ligatures:standardcontextual"><o:p></o:p></span></p>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">From:</span></b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> NFBCS <nfbcs-bounces@nfbnet.org>
<b>On Behalf Of </b>Ty Littlefield via NFBCS<br>
<b>Sent:</b> Sunday, February 22, 2026 1:44 PM<br>
<b>To:</b> NFB in Computer Science Mailing List <nfbcs@nfbnet.org><br>
<b>Cc:</b> Ty Littlefield <tyler@tysdomain.com><br>
<b>Subject:</b> Re: [NFBCS] From Taylor Arndt: I Got Fed Up With AI Forgetting Accessibility, So I Built a Team That Will Not<o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<p>This is awesome; thank you for doing it. How much of a difference have you found?<o:p></o:p></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.<o:p></o:p></p>
<p><o:p> </o:p></p>
<div>
<div>
<p><strong>Ty Littlefield (he/him/his)</strong><o:p></o:p></p>
<ul type="disc">
<li class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo1">
<a href="https://tysdomain.com" target="_blank">From Bytes to Bites</a>| <o:p></o:p></li><li class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo1">
<a href="https://www.linkedin.com/in/ty-lerlittlefield/">Linkedin</a><o:p></o:p></li></ul>
</div>
</div>
<div>
<p class="MsoNormal">On 2/22/2026 1:54 PM, dandrews920--- via NFBCS wrote:<o:p></o:p></p>
</div>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<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 border="0" 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"><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">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">
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">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"> <o:p></o:p></p>
</div>
<p class="MsoNormal"><span style="font-family:"Times New Roman",serif"><br>
<br>
<o:p></o:p></span></p>
<pre>_______________________________________________<o:p></o:p></pre>
<pre>NFBCS mailing list<o:p></o:p></pre>
<pre><a href="mailto:NFBCS@nfbnet.org">NFBCS@nfbnet.org</a><o:p></o:p></pre>
<pre><a href="http://nfbnet.org/mailman/listinfo/nfbcs_nfbnet.org">http://nfbnet.org/mailman/listinfo/nfbcs_nfbnet.org</a><o:p></o:p></pre>
<pre>To unsubscribe, change your list options or get your account info for NFBCS:<o:p></o:p></pre>
<pre><a href="http://nfbnet.org/mailman/options/nfbcs_nfbnet.org/tyler%40tysdomain.com">http://nfbnet.org/mailman/options/nfbcs_nfbnet.org/tyler%40tysdomain.com</a><o:p></o:p></pre>
</blockquote>
</div>
</body>
</html>