<!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:&quot;Arial&quot;,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>