<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/css" href="https://www.aaron-gustafson.com/c/feed.min.css" ?><feed xmlns="http://www.w3.org/2005/Atom"
      xmlns:amg="https://www.aaron-gustafson.com.com/amg-dtd/"><title>Aaron Gustafson: Content tagged AI/ML</title><subtitle>The latest 20 posts and links tagged AI/ML.</subtitle><id>https://www.aaron-gustafson.com</id><link href="https://www.aaron-gustafson.com/feeds/ai-ml.xml" rel="self"/><link href="https://www.aaron-gustafson.com"/><author><name>Aaron Gustafson</name><uri>https://www.aaron-gustafson.com</uri></author><updated>2026-04-29T12:40:00Z</updated><entry><id>https://www.aaron-gustafson.com/notebook/links/ai-companies-will-fail-we-can-salvage-something-from-the-wreckage/</id><title type="html"><![CDATA[🔗 AI companies will fail. We can salvage something from the wreckage]]></title><link href="https://www.aaron-gustafson.com/notebook/links/ai-companies-will-fail-we-can-salvage-something-from-the-wreckage/" rel="alternate" type="text/html" /><link href="https://www.theguardian.com/us-news/ng-interactive/2026/jan/18/tech-ai-bubble-burst-reverse-centaur" rel="related" type="text/html" /><published>2026-04-29T12:40:00Z</published><content type="html" xml:base="https://www.aaron-gustafson.com"><![CDATA[<p>Cory Doctorow offers a characteristically sharp critique of the AI bubble, but what I found most useful here is his framing of how these systems are actually meant to be deployed: not to empower workers, but to turn them into “reverse centaurs.”</p><p>That framing cuts through a lot of the marketing nonsense. The promise is always that AI will help people do their jobs better. The deployment story, far too often, is that a human gets stuck reviewing machine output at impossible speed while absorbing the blame when things go wrong. That’s not augmentation; it’s a liability dump.</p>]]></content><amg:twitter><![CDATA[This is a sharp and useful read from Cory Doctorow, especially his framing of workers being turned into ‘reverse centaurs’ and accountability sinks.]]></amg:twitter><amg:summary><![CDATA[Cory Doctorow offers a characteristically sharp critique of the AI bubble, but what I found most useful here is his framing of how these systems are actually meant to be deployed: not to empower workers, but to turn them into ‘reverse centaurs.’]]></amg:summary><summary type="html"><![CDATA[<p>Cory Doctorow offers a characteristically sharp critique of the AI bubble, but what I found most useful here is his framing of how these systems are actually meant to be deployed: not to empower workers, but to turn them into ‘reverse centaurs.’</p>]]></summary><category term="AI/ML" /><category term="society" /><category term="the future" /><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://i.guim.co.uk/img/media/3cab6e38d4ff57c0631ad4532131aa15878f8386/284_824_2216_1773/master/2216.jpg?width=1200&amp;height=630&amp;quality=85&amp;auto=format&amp;fit=crop&amp;precrop=40:21,offset-x50,offset-y0&amp;overlay-align=bottom%2Cleft&amp;overlay-width=100p&amp;overlay-base64=L2ltZy9zdGF0aWMvb3ZlcmxheXMvdGctZGVmYXVsdC5wbmc&amp;enable=upscale&amp;s=35399f4f1d76c88a6b1cc65f4fc711f5" /></entry><entry><id>https://www.aaron-gustafson.com/notebook/links/ai-assisted-coding-transforms-pdf-to-web-app-using-nys-design-system/</id><title type="html"><![CDATA[🔗 AI-assisted coding transforms PDF to web app using NYS Design System]]></title><link href="https://www.aaron-gustafson.com/notebook/links/ai-assisted-coding-transforms-pdf-to-web-app-using-nys-design-system/" rel="alternate" type="text/html" /><link href="https://www.linkedin.com/posts/plasticmind_designsystem-ai-civictech-share-7420295564430450688-0RM5/" rel="related" type="text/html" /><published>2026-04-29T12:30:00Z</published><content type="html" xml:base="https://www.aaron-gustafson.com"><![CDATA[<p>This is a compelling illustration of what becomes possible when a design system is structured well enough to be usable by both people and machines.</p><p>What’s exciting to me here is not “AI turned a PDF into an app” so much as what made that possible: components, tokens, utilities, and enough design-system clarity to give the model something useful to work with. That’s a big part of the story so many people miss. If your system is inconsistent, vague, or poorly documented, AI is just going to amplify that mess.</p>]]></content><amg:twitter><![CDATA[A well-structured design system is not just a delivery mechanism for consistency; it’s also critical infrastructure for AI-assisted coding.]]></amg:twitter><amg:summary><![CDATA[This is a compelling illustration of what becomes possible when a design system is structured well enough to be usable by both people and machines.]]></amg:summary><summary type="html"><![CDATA[<p>This is a compelling illustration of what becomes possible when a design system is structured well enough to be usable by both people and machines.</p>]]></summary><category term="AI/ML" /><category term="pattern libraries" /><category term="web development" /><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://media.licdn.com/dms/image/v2/D5622AQFo6j6tbFv-DA/feedshare-shrink_800/B56ZvovfsWIcAo-/0/1769136324329?e=2147483647&amp;amp;v=beta&amp;amp;t=r42eIGZqMXi54JFEnnbEc0X6GBPXxDIBEq9mOos1Qm0" /></entry><entry><id>https://www.aaron-gustafson.com/notebook/links/ai-is-locking-people-out-at-scale/</id><title type="html"><![CDATA[🔗 AI is locking people out. At Scale.]]></title><link href="https://www.aaron-gustafson.com/notebook/links/ai-is-locking-people-out-at-scale/" rel="alternate" type="text/html" /><link href="https://conesible.de/wab/" rel="related" type="text/html" /><published>2026-04-29T12:20:00Z</published><content type="html" xml:base="https://www.aaron-gustafson.com"><![CDATA[<p>An important and sharply argued framing of AI-generated accessibility failures as a civil-rights problem, not just a quality-control issue.</p><blockquote><p>This is not a minor bug trend. It is a systematic civil-rights failure that has now found its way into software as a whole, through lightning-fast adoption of AI systems that are trained on over 20 years of institutional barriers.</p></blockquote><p>The numbers here are bad enough on their own, but what makes this especially troubling is where these systems are being deployed: education, healthcare, finance, employment, and other places people can’t simply opt out of. That’s why I appreciate how direct this project is about accountability. If we automate interface generation without putting accessibility at the center, we’re automating exclusion.</p>]]></content><amg:twitter><![CDATA[This is the right framing: inaccessible AI-generated interfaces are not a minor bug trend; they’re a civil-rights failure at scale.]]></amg:twitter><amg:summary><![CDATA[An important and sharply argued framing of AI-generated accessibility failures as a civil-rights problem, not just a quality-control issue.]]></amg:summary><summary type="html"><![CDATA[<p>An important and sharply argued framing of AI-generated accessibility failures as a civil-rights problem, not just a quality-control issue.</p>]]></summary><category term="accessibility" /><category term="AI/ML" /><category term="society" /></entry><entry><id>https://www.aaron-gustafson.com/notebook/links/accessibility-in-the-end-of-deterministic-design-again/</id><title type="html"><![CDATA[🔗 Accessibility in the End of Deterministic Design (Again)]]></title><link href="https://www.aaron-gustafson.com/notebook/links/accessibility-in-the-end-of-deterministic-design-again/" rel="alternate" type="text/html" /><link href="https://www.deque.com/axe-con/sessions/accessibility-in-the-end-of-deterministic-design-again/" rel="related" type="text/html" /><published>2026-04-29T12:10:00Z</published><content type="html" xml:base="https://www.aaron-gustafson.com"><![CDATA[<p>The framing Anna Cook uses for her talk is an important one: accessibility isn’t something generative interfaces will magically solve; it’s the groundwork we need in order to make those systems trustworthy at all.</p><p>I also appreciate the callback in the title. We’ve been here before. The particulars may be new, but the core challenge is familiar: how do we build resilient, inclusive systems when the output is fluid, personalized, or otherwise beyond a designer’s exact control? Accessibility is not a bolt-on answer to that question; it’s where the answer has to begin.</p>]]></content><amg:twitter><![CDATA[Accessibility isn’t something generative interfaces will magically solve; it’s the groundwork we need in order to make them trustworthy at all.]]></amg:twitter><amg:summary><![CDATA[Accessibility isn’t something generative interfaces will magically solve; it’s the groundwork we need in order to make those systems trustworthy at all.]]></amg:summary><summary type="html"><![CDATA[<p>Accessibility isn’t something generative interfaces will magically solve; it’s the groundwork we need in order to make those systems trustworthy at all.</p>]]></summary><category term="accessibility" /><category term="AI/ML" /><category term="inclusive design" /></entry><entry><id>https://www.aaron-gustafson.com/notebook/links/endgame-for-the-open-web/</id><title type="html"><![CDATA[🔗 Endgame for the Open Web]]></title><link href="https://www.aaron-gustafson.com/notebook/links/endgame-for-the-open-web/" rel="alternate" type="text/html" /><link href="https://www.anildash.com/2026/03/27/endgame-open-web/" rel="related" type="text/html" /><published>2026-04-24T12:00:00Z</published><content type="html" xml:base="https://www.aaron-gustafson.com"><![CDATA[<p>This is a sobering but necessary reminder that the open web’s current crisis is not theoretical; it’s already playing out across publishing, open source, standards, and shared infrastructure.</p><p>I appreciate how clearly Anil connects dots that too many people are still treating as separate problems. This isn’t just about AI summaries siphoning traffic from publishers or slop code drowning maintainers or bad actors ignoring long-standing norms like <code>robots.txt</code>. It’s all of those things at once. The through-line is extraction: taking value from open systems without giving anything back, then undermining the very ecosystems that made that extraction possible in the first place.</p><blockquote><p>The good of the web only exists because of the openness of the web. They can’t just keep on taking and taking without expecting people to finally draw a line and saying “enough”.</p></blockquote><p>If you care about the web as a public good, this post is worth your time.</p>]]></content><amg:twitter><![CDATA[This is a tough read, but an important one: the attacks on the open web are not abstract anymore.]]></amg:twitter><amg:summary><![CDATA[A sobering but necessary reminder that the open web’s current crisis is not theoretical; it’s already playing out across publishing, open source, standards, and shared infrastructure.]]></amg:summary><summary type="html"><![CDATA[<p>A sobering but necessary reminder that the open web’s current crisis is not theoretical; it’s already playing out across publishing, open source, standards, and shared infrastructure.</p>]]></summary><category term="the web" /><category term="AI/ML" /><category term="society" /><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.anildash.com/images/tunnel.jpg" /></entry><entry><id>https://www.aaron-gustafson.com/notebook/links/ai-is-accidently-making-documentation-accessible/</id><title type="html"><![CDATA[🔗 AI is accidently making documentation accessible]]></title><link href="https://www.aaron-gustafson.com/notebook/links/ai-is-accidently-making-documentation-accessible/" rel="alternate" type="text/html" /><link href="https://gerireid.com/blog/ai-is-accidently-making-documentation-accessible/" rel="related" type="text/html" /><published>2026-04-23T12:15:00Z</published><content type="html" xml:base="https://www.aaron-gustafson.com"><![CDATA[<p>The real takeaway is that documentation written for clarity is better for everyone — human or machine!</p><p>In other words, AI use is reinforcing what good documentation has always required: clear structure, explicit language, sensible headings, and fewer assumptions about what the reader already knows. That’s good for machines, sure, but it’s even better for people navigating with assistive tech, reading in a second language, or simply trying to get an answer quickly.</p><blockquote><p>AI has not invented new rules for writing, it has made the cost of ignoring the old ones obvious.</p></blockquote>]]></content><amg:twitter><![CDATA[AI didn’t invent better documentation practices; it just exposed how valuable structure, clarity, and explicitness have always been.]]></amg:twitter><amg:summary><![CDATA[Documentation written for clarity is better for everyone — human or machine!]]></amg:summary><summary type="html"><![CDATA[<p>Documentation written for clarity is better for everyone — human or machine!</p>]]></summary><category term="accessibility" /><category term="AI/ML" /><category term="writing" /><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://gerireid.com/images/open-graph.png" /></entry><entry><id>https://www.aaron-gustafson.com/notebook/links/some-blind-fans-to-experience-super-bowl-with-tactile-device-that-tracks-ball/</id><title type="html"><![CDATA[🔗 Some blind fans to experience Super Bowl with tactile device that tracks ball]]></title><link href="https://www.aaron-gustafson.com/notebook/links/some-blind-fans-to-experience-super-bowl-with-tactile-device-that-tracks-ball/" rel="alternate" type="text/html" /><link href="https://apnews.com/article/nfl-blind-fans-super-bowl-6daf12a08127c46c23dab6100a659681" rel="related" type="text/html" /><published>2026-02-06T19:40:06Z</published><content type="html" xml:base="https://www.aaron-gustafson.com"><![CDATA[<p>A few years ago, a couple students at the University of Washington asked me to come to their campus for a visit. They gave me a demo of an early prototype they’d been working on — a haptic feedback device that could allow someone who is Blind or low vision to follow a game. The demo took video data from a tennis match and mapped it onto the haptic tablet. It felt like Pong, but they had a bolder vision — tackling fast-moving and complicated sports like basketball, football, American football, and hockey.</p><p>I immediately invited them to pitch us for the AI for Accessibility Grant Program that I ran for Microsoft. With so much focus on assistive technology to enable folks to work and accomplish common life tasks, I loved that the OneCourt team was interested in enabling people with disabilities to enjoy leisure activities like sporting events. Moreover, I saw the potential to enable Blind and low-vision parents to experience their kids’ sporting events, which could be life-changing for them.</p><p>Needless to say, they wowed both me and the rest of the seleciton committee. We funded them to expand their prototypes and pursue partnerships with different professional sports leagues, teams, and venues. They were ambitious and it’s paying off.</p><p>Fast forward a few years and they’re enabling a handful of Blind &amp; low vision sports fans to exerience the Super Bowl in a whole new way, using their technology. It’s amazing and I could not be more proud of them.</p><p>Congrats y’all!</p>]]></content><amg:twitter><![CDATA[So proud of the OneCourt team for their work in bringing more leisure opportunities to the Blind & low vision community.]]></amg:twitter><category term="accessibility" /><category term="inclusive design" /><category term="AI/ML" /><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://dims.apnews.com/dims4/default/9b439cc/2147483647/strip/true/crop/5333x3554+0+1/resize/980x653!/quality/90/?url=https%3A%2F%2Fassets.apnews.com%2F1b%2Fe5%2F28e0bd88c1be654d380ee1c3b2f2%2F9a7b2e31c9464fa6a86eb6d04b0a3266" /></entry><entry><id>https://www.aaron-gustafson.com/notebook/links/forrester-research-as-technology-has-evolved-so-has-the-need-for-accessibility/</id><title type="html"><![CDATA[🔗 Forrester Research: As technology has evolved, so has the need for accessibility]]></title><link href="https://www.aaron-gustafson.com/notebook/links/forrester-research-as-technology-has-evolved-so-has-the-need-for-accessibility/" rel="alternate" type="text/html" /><link href="https://blogs.microsoft.com/accessibility/forrester-research-2025/" rel="related" type="text/html" /><published>2025-12-05T17:46:26Z</published><content type="html" xml:base="https://www.aaron-gustafson.com"><![CDATA[<p>A recent paper from Forrester (commissioned by Microsoft, my employer), has confirmed my anedotal experiences are not outliers:</p><blockquote><p>This new study, based on a 2025 online survey of 3,901 US consumers, confirms what many of us know: accessible technology empowers everyone. And with the rise of AI, we’re entering a new era of possibility.</p></blockquote><p>One of the stats that’s likely to be surprising to many people is that people who identify as having disabilities and those who don’t both use assistive technology features at nearly the same rate.</p><p>Full details of the research report are here: <a href="https://aka.ms/ForresterAccessibility2025">Oh, The Things We Can Do Together — How Assistive Technology Is Unlocking Human Potential In The Era Of AI</a></p>]]></content><amg:twitter><![CDATA[“Accessible technology empowers everyone. And with the rise of AI, we’re entering a new era of possibility.”]]></amg:twitter><category term="accessibility" /><category term="AI/ML" /><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogs.microsoft.com/wp-content/uploads/sites/172/2025/11/Forrester-Accessibility-Report-Cover-1024x576.jpg" /></entry><entry><id>https://www.aaron-gustafson.com/notebook/optimizing-your-codebase-for-ai-coding-agents/</id><title type="html"><![CDATA[✍🏻 Optimizing Your Codebase for AI Coding Agents]]></title><link href="https://www.aaron-gustafson.com/notebook/optimizing-your-codebase-for-ai-coding-agents/" rel="alternate" type="text/html" /><published>2025-10-21T22:11:32Z</published><content type="html" xml:base="https://www.aaron-gustafson.com"><![CDATA[<p>I’ve been playing around a bit with GitHub Copilot as an autonomous agent to help with software development. The results have been mixed, but positive overall. I made an interesting discovery when I took the time to read through the agent’s reasoning over a particular task. I thought the task was straightforward, but I was wrong. Watching the agent work was like watching someone try to navigate an unfamiliar room, in complete darkness, with furniture and Lego bricks scattered everywhere.</p><p>The good news? Most of the issues weren’t actually <em>code</em> problems; they were organizational and documentation problems. The kinds of problems that make tasks hard for humans too.</p><p>As I watched the agent struggle, I realized that optimizing for AI agents is really just about removing ambiguity and making implicit knowledge explicit. In other words: it’s just good engineering.</p><h2 id="what-did-i-learn%3F" tabindex="-1"><a class="header-anchor" href="#what-did-i-learn%3F" aria-hidden="true">#</a> What did I learn?</h2><p>After reviewing the agent’s execution logs (which read like a stream-of-consciousness diary of confusion), several patterns emerged:</p><h3 id="1.-documentation-sprawl-is-an-efficiency-killer" tabindex="-1"><a class="header-anchor" href="#1.-documentation-sprawl-is-an-efficiency-killer" aria-hidden="true">#</a> 1. <strong>Documentation sprawl is an efficiency killer</strong></h3><p>The agent spent roughly 40% of its time just trying to figure out which documentation to trust. We had instructions in workflow comments, the README, task specific instructions, and more. In other words, we had no clear source of truth. Pieces of that truth were scattered across multiple files and the docs were inconsistent and — in some cases — contradictory.</p><p>Sound familiar? It’s the equivalent of having five different “getting started” guides that all got written at different times by different people and nobody bothered to consolidate them. (If you’ve ever worked on a project that’s been around for more than a year with no one in charge of documentation, you know exactly what I’m talking about.)</p><p><strong>The fix:</strong> Establish a single source of truth. Ruthlessly. We consolidated everything into one comprehensive guide and updated all references to point <em>only</em> there. Deprecated docs were deleted and/or redirected, as appropriate. No more choose your own adventure. No more guessing.</p><h3 id="2.-agents-won%E2%80%99t-optimize-themselves" tabindex="-1"><a class="header-anchor" href="#2.-agents-won%E2%80%99t-optimize-themselves" aria-hidden="true">#</a> 2. <strong>Agents won’t optimize themselves</strong></h3><p>Here’s a fun one: the agent ran several full production builds—complete with image processing, template compilation… the whole shebang—just to validate a markdown file was in the right format. These builds took 30-60 seconds. <em>Each time.</em></p><p>This is like requiring someone to assemble an entire car just to check if the owner’s guide is displaying the right “check engine” symbol. Technically it works, but yikes.</p><p><strong>The fix:</strong> Write fast, focused validation scripts. One tool for each job. Tell the agent what the utility is, where to find it, and how to use it. Give it explicit instructions to use utility scripts in lieu of full site builds whenever possible.</p><h3 id="3.-ambiguity-breeds-confusion-(and-wasted-tokens)" tabindex="-1"><a class="header-anchor" href="#3.-ambiguity-breeds-confusion-(and-wasted-tokens)" aria-hidden="true">#</a> 3. <strong>Ambiguity breeds confusion (and wasted tokens)</strong></h3><p>The agent spent 15+ minutes having an internal philosophical debate about whether to process test data. Should it reject it? Accept it? Create a placeholder? The instructions didn’t say, so the agent did what any of us would do: it agonized — or at least feigned agonizing — over the decision and tried to infer intent from context clues.</p><p><strong>The fix:</strong> Be explicit about edge cases. We added a dedicated section for handling test form submissions. No more guessing.</p><h2 id="there%E2%80%99s-a-pattern-here" tabindex="-1"><a class="header-anchor" href="#there%E2%80%99s-a-pattern-here" aria-hidden="true">#</a> There’s a pattern here</h2><p>If you squint, all of these issues share a common root cause: <strong>implicit assumptions</strong>.</p><p>We assumed humans would know to check one doc instead of five. We assumed the difference between validation and building was obvious. We assumed everyone would understand how to handle edge cases.</p><p>AI agents don‘t — can’t? — make those assumptions. They need explicit instructions, clear boundaries, and unambiguous inputs. Honestly? So do humans. We’re just better at muddling through — or think we are.</p><h2 id="early-results" tabindex="-1"><a class="header-anchor" href="#early-results" aria-hidden="true">#</a> Early results</h2><p>After implementing these changes, we expect (and early testing confirms):</p><ul><li>~40% reduction in processing time,</li><li>~75% reduction in token usage, and</li><li>&gt;80% reduction in confusion and circular reasoning.</li></ul><p>But here’s the thing: these improvements don’t just help the AI agent. They help <em>everyone</em>. The consolidated documentation is easier to navigate. The fast validation scripts are useful for humans too. The explicit edge case handling prevents future questions.</p><h2 id="the-key-to-reducing-toil%3A-excellent-docs-and-tools" tabindex="-1"><a class="header-anchor" href="#the-key-to-reducing-toil%3A-excellent-docs-and-tools" aria-hidden="true">#</a> The key to reducing toil: excellent docs and tools</h2><p>Optimizing for AI agents isn’t really about AI. It’s about removing ambiguity, eliminating redundancy, and making implicit knowledge explicit. It’s about writing code and documentation that doesn’t require a deep understanding of the project to comprehend.</p><p>In other words: it’s just good engineering.</p><p>So if you’re working with AI coding agents — or planning to — invest in your docs and tooling. Don’t think of it as wasted time “writing for robots.” Think of it as paying down documentation debt and building an efficient engineering process.</p><p>Your future self, your teammates, and the bots will thank you.</p><h2 id="afterword" tabindex="-1"><a class="header-anchor" href="#afterword" aria-hidden="true">#</a> Afterword</h2><p>Interestingly, an AI agent was a particularly useful partner in finding and addressing the technical debt we’d been living with. Sometimes you need a pedantic robot to point out that your house is a mess.</p>]]></content><amg:summary><![CDATA[By looking at how a model reasons over a codebase to solve tasks, I found ways to help it — as well as the human engineers working in the same project — reduce wasted time.]]></amg:summary><summary type="html"><![CDATA[<p>By looking at how a model reasons over a codebase to solve tasks, I found ways to help it — as well as the human engineers working in the same project — reduce wasted time.</p>]]></summary><category term="AI/ML" /><category term="software development" /><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.aaron-gustafson.com/i/posts/2025-10-21/hero.jpg" /></entry><entry><id>https://www.aaron-gustafson.com/notebook/identifying-accessibility-data-gaps-in-codegen-models/</id><title type="html"><![CDATA[✍🏻 Identifying Accessibility Data Gaps in CodeGen Models]]></title><link href="https://www.aaron-gustafson.com/notebook/identifying-accessibility-data-gaps-in-codegen-models/" rel="alternate" type="text/html" /><published>2025-10-16T19:12:02Z</published><content type="html" xml:base="https://www.aaron-gustafson.com"><![CDATA[<p>Late last year, I probed an LLM’s responses to HTML code generation prompts to assess its adherence to accessibility best practices. The results were unsurprisingly disappointing — roughly what I’d expect from a developer aware of accessibility but unsure how to implement it. The study highlighted key areas where training data needs improvement.</p><h2 id="why-take-on-this-challenge%3F" tabindex="-1"><a class="header-anchor" href="#why-take-on-this-challenge%3F" aria-hidden="true">#</a> Why take on this challenge?</h2><p>I get it — you probably rolled your eyes at yet another “AI and accessibility” post. Maybe you think AI-assisted coding is overhyped, environmentally harmful, unreliable, or just plain dangerous for our craft. I share many of those concerns. But here’s the thing: whether we like it or not, codegen models aren’t going anywhere. GitHub Copilot has millions of users, and tools like Claude Code and Cursor are rapidly gaining popularity.</p><p>So we have a choice: we can complain about the inevitable tide of AI-generated garbage code, or we can get in there and figure out how to make it better — especially when it comes to accessibility.</p><p>We’re facing a looming wave of inaccessible code that will be extremely difficult to remediate later. The foundation models are already being trained on the collective output of the web’s development community — a community that doesn’t have a high bar high for accessibility already. Codegen models are a massive consultancy staffed with <a href="https://christianheilmann.com/2015/07/17/the-full-stackoverflow-developer/">full StackOverflow developers</a>. We need to figure out how to make them part of the solution, not part of the problem.</p><p>It’s also worth noting that the better we make the output of these models, the fewer bugs will be generated. That, in turn, means fewer accessibility issues to fix later. If we don’t, there are plenty of AI-assisted scanners out there happy to burn the rainforest to find and remediate the bugs after the fact. We risk doubling the environmental impact—once to generate the bug, and again to fix it. That’s not the future I want. The reality here is that the only way to deal with this flood of AI-generated code is to make sure it’s good code in the first place.</p><h2 id="how-did-i-conduct-my-research%3F" tabindex="-1"><a class="header-anchor" href="#how-did-i-conduct-my-research%3F" aria-hidden="true">#</a> How did I conduct my research?</h2><p>Rather than relying on anecdotal evidence or cherry-picked examples, I built a systematic approach to evaluate how well LLMs — starting with GPT-4 — generate accessible HTML. The methodology is straightforward but comprehensive: I created a Python testing framework that sent carefully crafted prompts to Azure OpenAI’s GPT 4 model, collected the generated HTML responses, and then manually analyzed these responses for accessibility compliance.</p><p>Here’s how it works:</p><p><strong>Prompt Engineering</strong>: I designed prompts that ask for specific UI components—form fields, navigation menus, interactive elements—without explicitly mentioning accessibility requirements. This gives us a baseline of what the model considers “standard” output. I included one prompt that specifically requested accessibility features to see if the model could improve when guided. I suspected it would often add ARIA attributes without addressing underlying issues, but I wanted to validate that too.</p><p><strong>Response Collection</strong>: For each prompt, I generated 10 iterations at high temperature (0.95) to capture the model’s range of responses. Each unique response got saved as an individual HTML file for analysis.</p><p><strong>Systematic Analysis</strong>: I manually review each generated code snippet, cataloging accessibility errors, warnings, and missed opportunities. I tried using the LLM as a judge, but even with a detailed rubric, the results were poor. My eval looked specifically for things like:</p><ul><li>Improper semantic HTML usage</li><li>Missing or incorrect ARIA attributes</li><li>Keyboard navigation issues</li><li>Screen reader compatibility problems</li><li>Form labeling errors</li></ul><p>When I identified errors, I remediated them and committed the remediated file to the repo with a commit message that included all of the issues and warnings on its own line.</p><p><strong>Diff-Based Retesting</strong>: I wanted to see if diff data could improve future codegen requests, so I created a tool to generate a collection of <code>.diff</code> files for each pattern that included the commit message as a header in each file. I then used those diff files as part of a new instance of the prompt to test whether the model can improve its output when guided.</p><h2 id="what-did-i-learn%3F" tabindex="-1"><a class="header-anchor" href="#what-did-i-learn%3F" aria-hidden="true">#</a> What did I learn?</h2><p>After analyzing hundreds of generated code snippets, the results are sobering. The model consistently demonstrates what I’d describe as superficial awareness without true understanding — it knows accessibility concepts exist but fundamentally misunderstands their purpose and proper implementation.</p><p>Here are some of the patterns I’ve documented:</p><p><strong>Form Label Disasters</strong>: When asked to create a required text field, the model failed to include a visible label:</p><pre class="language-html" tabindex="0"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>input</span><span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">“</span>text<span class="token punctuation">”</span></span><span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">“</span>orangeColor<span class="token punctuation">”</span></span><span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">“</span>orangeColor<span class="token punctuation">”</span></span><span class="token attr-name">required</span><span class="token attr-name">placeholder</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">“</span>What color is an orange?<span class="token punctuation">”</span></span><span class="token punctuation">/&gt;</span></span></code></pre><p>Sure, the <code>placeholder</code> attribute is there, and in a pinch it will be included in a field’s accessible name calculation, but sighted users will lose the label as soon as they start typing.</p><p><strong>ARIA Attribute Confusion</strong>: The model would routinely involve ARIA for no reason:</p><pre class="language-html" tabindex="0"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>label</span><span class="token attr-name">for</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">“</span>color-question<span class="token punctuation">”</span></span><span class="token punctuation">&gt;</span></span>What color is an orange? <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>span</span><span class="token special-attr"><span class="token attr-name">style</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">“</span><span class="token value css language-css"><span class="token property">color</span><span class="token punctuation">:</span> red<span class="token punctuation">;</span></span><span class="token punctuation">”</span></span></span><span class="token punctuation">&gt;</span></span>*<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>span</span><span class="token punctuation">&gt;</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>label</span><span class="token punctuation">&gt;</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>input</span><span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">“</span>text<span class="token punctuation">”</span></span><span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">“</span>color-question<span class="token punctuation">”</span></span><span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">“</span>color-question<span class="token punctuation">”</span></span><span class="token attr-name">required</span><span class="token attr-name">aria-required</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">“</span>true<span class="token punctuation">”</span></span><span class="token attr-name">aria-labelledby</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">“</span>color-question<span class="token punctuation">”</span></span><span class="token punctuation">/&gt;</span></span></code></pre><p>Here the <code>for</code> attribute already establishes the relationship between the label and input, so <code>aria-labelledby</code> is redundant. A bit of a nitpick, but the <code>aria-required=&quot;true&quot;</code> is also unnecessary since the native <code>required</code> attribute already conveys that information to assistive technologies. <code>aria-required=&quot;true&quot;</code> is only needed when creating custom form controls non-semantic markup.</p><p><strong>Redundant ARIA</strong>: Keeping on the ARIA redundancy, consider examples like this:</p><pre class="language-html" tabindex="0"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>input</span><span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">“</span>radio<span class="token punctuation">”</span></span><span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">“</span>option1<span class="token punctuation">”</span></span><span class="token attr-name">aria-labelledby</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">“</span>label1<span class="token punctuation">”</span></span><span class="token attr-name">aria-label</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">“</span>Option 1<span class="token punctuation">”</span></span><span class="token punctuation">/&gt;</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>label</span><span class="token attr-name">for</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">“</span>option1<span class="token punctuation">”</span></span><span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">“</span>label1<span class="token punctuation">”</span></span><span class="token punctuation">&gt;</span></span>Option 1<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>label</span><span class="token punctuation">&gt;</span></span></code></pre><p>This redundancy raises the question <em>why‽</em></p><p><strong>Required Field Misapplication</strong>: For checkbox groups where users need to select “one or more,” the model often adds <code>required</code> to individual checkboxes:</p><pre class="language-html" tabindex="0"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>fieldset</span><span class="token punctuation">&gt;</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>legend</span><span class="token punctuation">&gt;</span></span>What fruits do you like?<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>legend</span><span class="token punctuation">&gt;</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span><span class="token punctuation">&gt;</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>input</span><span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">“</span>checkbox<span class="token punctuation">”</span></span><span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">“</span>bananas<span class="token punctuation">”</span></span><span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">“</span>fruits<span class="token punctuation">”</span></span><span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">“</span>bananas<span class="token punctuation">”</span></span><span class="token attr-name">required</span><span class="token punctuation">/&gt;</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>label</span><span class="token attr-name">for</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">“</span>bananas<span class="token punctuation">”</span></span><span class="token punctuation">&gt;</span></span>Bananas<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>label</span><span class="token punctuation">&gt;</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">&gt;</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span><span class="token punctuation">&gt;</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>input</span><span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">“</span>checkbox<span class="token punctuation">”</span></span><span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">“</span>oranges<span class="token punctuation">”</span></span><span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">“</span>fruits<span class="token punctuation">”</span></span><span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">“</span>oranges<span class="token punctuation">”</span></span><span class="token attr-name">required</span><span class="token punctuation">/&gt;</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>label</span><span class="token attr-name">for</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">“</span>oranges<span class="token punctuation">”</span></span><span class="token punctuation">&gt;</span></span>Oranges<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>label</span><span class="token punctuation">&gt;</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">&gt;</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span><span class="token punctuation">&gt;</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>input</span><span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">“</span>checkbox<span class="token punctuation">”</span></span><span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">“</span>apples<span class="token punctuation">”</span></span><span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">“</span>fruits<span class="token punctuation">”</span></span><span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">“</span>apples<span class="token punctuation">”</span></span><span class="token attr-name">required</span><span class="token punctuation">/&gt;</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>label</span><span class="token attr-name">for</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">“</span>apples<span class="token punctuation">”</span></span><span class="token punctuation">&gt;</span></span>Apples<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>label</span><span class="token punctuation">&gt;</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">&gt;</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span><span class="token special-attr"><span class="token attr-name">style</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">“</span><span class="token value css language-css"><span class="token property">color</span><span class="token punctuation">:</span> red<span class="token punctuation">;</span><span class="token property">display</span><span class="token punctuation">:</span> none<span class="token punctuation">;</span></span><span class="token punctuation">”</span></span></span><span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">“</span>validation-error<span class="token punctuation">”</span></span><span class="token punctuation">&gt;</span></span>You must choose one or more fruits<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">&gt;</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>fieldset</span><span class="token punctuation">&gt;</span></span></code></pre><p>This breaks the intended behavior—if any checkbox is marked required, it must be checked for form validation to pass. For a web component that addresses this limitation in HTML, see my post “<a href="/notebook/requirement-rules-for-checkboxes/">Requirement Rules for Checkboxes</a>.”</p><p><strong>Grouped Field Confusion</strong>: Not understanding when to use <code>fieldset</code> and <code>legend</code> (or at least using <code>role=&quot;group&quot;</code> and <code>aria-labelledby</code>) on a field group:</p><pre class="language-html" tabindex="0"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span><span class="token punctuation">&gt;</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>label</span><span class="token punctuation">&gt;</span></span>Select Theme:<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>label</span><span class="token punctuation">&gt;</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span><span class="token punctuation">&gt;</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>input</span><span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">“</span>radio<span class="token punctuation">”</span></span><span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">“</span>light<span class="token punctuation">”</span></span><span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">“</span>theme<span class="token punctuation">”</span></span><span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">“</span>light<span class="token punctuation">”</span></span><span class="token punctuation">/&gt;</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>label</span><span class="token attr-name">for</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">“</span>light<span class="token punctuation">”</span></span><span class="token punctuation">&gt;</span></span>Light<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>label</span><span class="token punctuation">&gt;</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">&gt;</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span><span class="token punctuation">&gt;</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>input</span><span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">“</span>radio<span class="token punctuation">”</span></span><span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">“</span>dark<span class="token punctuation">”</span></span><span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">“</span>theme<span class="token punctuation">”</span></span><span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">“</span>dark<span class="token punctuation">”</span></span><span class="token punctuation">/&gt;</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>label</span><span class="token attr-name">for</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">“</span>dark<span class="token punctuation">”</span></span><span class="token punctuation">&gt;</span></span>Dark<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>label</span><span class="token punctuation">&gt;</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">&gt;</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span><span class="token punctuation">&gt;</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>input</span><span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">“</span>radio<span class="token punctuation">”</span></span><span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">“</span>high-contrast<span class="token punctuation">”</span></span><span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">“</span>theme<span class="token punctuation">”</span></span><span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">“</span>high-contrast<span class="token punctuation">”</span></span><span class="token punctuation">/&gt;</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>label</span><span class="token attr-name">for</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">“</span>high-contrast<span class="token punctuation">”</span></span><span class="token punctuation">&gt;</span></span>High Contrast<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>label</span><span class="token punctuation">&gt;</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">&gt;</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>p</span><span class="token punctuation">&gt;</span></span>You can change this later<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>p</span><span class="token punctuation">&gt;</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">&gt;</span></span></code></pre><p>Ideally, this would be a <code>fieldset</code> with a <code>legend</code> and the descriptive text would appear right after the <code>legend</code> and be associated with the group using <code>aria-describedby</code>.</p><p><strong>Color-Only Error Indication</strong>: Generating error states that rely solely on color changes without text indicators or proper ARIA attributes to convey the error state to screen readers.</p><p><strong>Unnecessary Role Additions</strong>: Adding redundant roles like <code>role=&quot;radiogroup&quot;</code> to properly structured fieldsets containing radio inputs, where the native semantics already provide the correct accessibility tree.</p><p><strong>Missing Error State Management</strong>: Failing to include <code>aria-invalid=&quot;true&quot;</code> on fields with errors or properly associate error messages with their corresponding form controls.</p><p><strong>Lack of Wayfinding Help</strong>: Failing to include navigational labels and <code>aria-current=&quot;page&quot;</code> in a breadcrumb nav.</p><p><strong>Adding Unnecessary JavaScript</strong>: Even though it was instructed to only generate JavaScript when absolutely necessary, the model would often inject JavaScript for simple tasks that could be handled with HTML and CSS alone.</p><h2 id="how-does-this-help%3F" tabindex="-1"><a class="header-anchor" href="#how-does-this-help%3F" aria-hidden="true">#</a> How Does This Help?</h2><p>Here’s where things get interesting — and hopeful. When I retested using prompts that included accessibility hints, the model’s output improved dramatically. Not just slightly better, but often going from fundamentally broken to genuinely accessible.</p><p>For example, when I added diff data related to fieldset use to a prompt about radio button groups, the model switched from generating meaningless <code>div</code> wrappers to proper semantic structures.</p><p>This suggests the model can produce quality code if properly primed. It also indicates that the training data likely lacks sufficient examples of well-implemented accessible components. If the model had been trained on a richer dataset of accessible code, it might not need such explicit guidance to produce good results.</p><h2 id="where-do-we-go-from-here%3F" tabindex="-1"><a class="header-anchor" href="#where-do-we-go-from-here%3F" aria-hidden="true">#</a> Where Do We Go From Here?</h2><p>These findings point to several concrete approaches for improving accessibility in AI-generated code:</p><p><strong>Enhanced Training Data</strong>: The models need exposure to more high-quality, accessible code examples. Current training data clearly overrepresents inaccessible implementations. We need comprehensive datasets of properly implemented accessible components across different frameworks and use cases.</p><p><strong>Accessibility-Aware Fine-Tuning</strong>: Post-training refinement specifically focused on accessibility compliance could help models prioritize inclusive patterns. This could involve training on accessibility-annotated code pairs — showing inaccessible implementations alongside their accessible counterparts, like the diffs do.</p><p><strong>Prompt Engineering Guidelines</strong>: Tool creators should integrate accessibility considerations into their default system prompts. Instead of just asking for “clean, semantic HTML,” prompts should provide detailed instructions to demonstrate accessibility best practices rather than pointing at often vague guidelines like WCAG.”</p><p><strong>Integrated Accessibility Validation</strong>: IDE integrations should include real-time accessibility linting of AI-generated code, providing immediate feedback and suggestions for improvement.</p><p><strong>Community-Contributed Training Data</strong>: We should coordinate our efforts to produce an open source, high-quality accessible code dataset so that this data can be integrated into future models.</p><hr><p>The data from this project provides a roadmap for where to focus these efforts. We’re not dealing with models that are fundamentally incapable of generating accessible code — we’re dealing with models that haven’t been properly trained to prioritize accessibility by default.</p><h2 id="want-to-get-involved%3F" tabindex="-1"><a class="header-anchor" href="#want-to-get-involved%3F" aria-hidden="true">#</a> Want to Get Involved?</h2><p>If you want to conduct similar evaluations with your preferred models or specific use cases, I’ve created a template repository with the testing framework: <a href="https://github.com/aarongustafson/CodeGen-Model-Eval-and-Refine-Tools">CodeGen Model Eval and Refine Tools</a>. It includes the Python testing harness, prompt templates, and analysis guidelines to get you started.</p><p>The complete findings, methodology details, and code samples for my research are available <a href="https://github.com/aarongustafson/testing-llm-code-a11y">on GitHub</a>. I encourage you to dig into the data — it’s eye-opening and frustrating, yes, but ultimately actionable.</p><p>There are other projects and research exploring this space as well. A few worth checking out:</p><ul><li><a href="https://aimac.ai/">AIMAC</a> - The AI Model Accessibility Checker (AIMAC) Leaderboard measures how well LLMs generate accessible HTML pages using neutral prompts without specific accessibility guidance. Checks are performed with axe-core.</li><li><a href="https://github.com/microsoft/a11y-llm-eval">A11y LLM Evaluation Harness and Dataset</a> - A more recent research project to evaluate how well various LLM models generate accessible HTML content.</li></ul><hr><p>We’re at a critical moment where the patterns established in AI-assisted development will shape the accessibility of the web for years to come. We can either let this technology amplify existing accessibility problems, or we can tackle the problems head-on and be part of the solution.</p>]]></content><amg:twitter><![CDATA[I probed an LLM’s responses to HTML code generation prompts to assess its adherence to accessibility best practices. The results showed key areas where better training data is needed.]]></amg:twitter><amg:summary><![CDATA[I probed an LLM’s responses to HTML code generation prompts to assess its adherence to accessibility best practices. The results showed key areas where better training data is needed.]]></amg:summary><summary type="html"><![CDATA[<p>I probed an LLM’s responses to HTML code generation prompts to assess its adherence to accessibility best practices. The results showed key areas where better training data is needed.</p>]]></summary><category term="accessibility" /><category term="AI/ML" /><category term="HTML" /><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.aaron-gustafson.com/i/posts/2025-10-15/hero.png" /></entry><entry><id>https://www.aaron-gustafson.com/notebook/links/why-i-m-betting-against-ai-agents-in-2025-despite-building-them-/</id><title type="html"><![CDATA[🔗 Why I'm Betting Against AI Agents in 2025 (Despite Building Them)]]></title><link href="https://www.aaron-gustafson.com/notebook/links/why-i-m-betting-against-ai-agents-in-2025-despite-building-them-/" rel="alternate" type="text/html" /><link href="https://utkarshkanwat.com/writing/betting-against-agents/" rel="related" type="text/html" /><published>2025-08-04T18:51:12Z</published><content type="html" xml:base="https://www.aaron-gustafson.com"><![CDATA[<p>I think it’s really key to understand what AI is good for and where it falls short. Not just in terms of results, but in terms of externalities as well.</p><p>To that end, this is a piece worth reading. To me, the golden nugget is this (when discussing who will succeed with AI agents):</p><blockquote><p>[T]he winners will be teams building constrained, domain-specific tools that use AI for the hard parts while maintaining human control or strict boundaries over critical decisions. Think less “autonomous everything” and more “extremely capable assistants with clear boundaries.”</p></blockquote>]]></content><amg:twitter><![CDATA[On the 20-step problem and the economics of agentic AI.]]></amg:twitter><category term="AI/ML" /><category term="industry" /><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://utkarshkanwat.com/writing/betting-against-agents/error_compounding_graph.svg" /></entry><entry><id>https://www.aaron-gustafson.com/notebook/links/why-ai-won-t-destroy-us-with-microsoft-s-brad-smith/</id><title type="html"><![CDATA[🔗 Why AI Won’t Destroy Us with Microsoft’s Brad Smith]]></title><link href="https://www.aaron-gustafson.com/notebook/links/why-ai-won-t-destroy-us-with-microsoft-s-brad-smith/" rel="alternate" type="text/html" /><link href="https://tools-and-weapons-with-brad-smith.simplecast.com/episodes/why-ai-wont-destroy-us" rel="related" type="text/html" /><published>2025-07-14T20:47:50Z</published><content type="html" xml:base="https://www.aaron-gustafson.com"><![CDATA[<p>In this episode, Trevor Noah and Brad Smith talk about a lot of things, but I think the most prescient is their discussion of information bubbles and organizing around labels. Trevor astutely observes how the source of information often colors how we receive that information and whether we consider it or reject it out of hand. In today’s media ecosystem, the system of “in groups” and “out groups” creates deep division and makes us more susceptible to misinformation.</p>]]></content><amg:twitter><![CDATA[I really appreciate this discussion of how we create information bubbles and labeled lenses through which we process information. It starts around minute 20.]]></amg:twitter><category term="society" /><category term="AI/ML" /></entry><entry><id>https://www.aaron-gustafson.com/appearances/podcasts/accessibility-in-automated-systems/</id><title type="html"><![CDATA[🎧 Accessibility in Automated Systems]]></title><link href="https://www.linkedin.com/video/live/urn:li:ugcPost:7330624084201852928/" rel="alternate" type="text/html" /><published>2025-05-20T00:00:00Z</published><content type="html" xml:base="https://www.aaron-gustafson.com"><![CDATA[<p>I chatted with Sharon Steed on a variety of topics ranging from accessibility to diversity, representation, AI, politics, the future, and more.</p>]]></content><category term="accessibility" /><category term="AI/ML" /><category term="empathy" /><category term="inclusion" /><category term="the future" /></entry><entry><id>https://www.aaron-gustafson.com/notebook/exploring-ais-role-in-accessibility-with-gymnasium/</id><title type="html"><![CDATA[✍🏻 Exploring AI’s Role in Accessibility]]></title><link href="https://www.aaron-gustafson.com/notebook/exploring-ais-role-in-accessibility-with-gymnasium/" rel="alternate" type="text/html" /><published>2025-04-14T16:11:54Z</published><content type="html" xml:base="https://www.aaron-gustafson.com"><![CDATA[<p>Earlier this month I joined Jeremy Osborne and Andrew Miller to talk about the benefits and harms of AI as it relates to accessibility. It was livestreamed on a few platforms, but I wanted to drop links to the transcript and archival video in case you’re interested.</p><figure><p><a href="https://www.youtube.com/watch?v=7ObB4jM-QXU">https://www.youtube.com/watch?v=7ObB4jM-QXU</a></p></figure><p><a href="https://github.com/gymnasium/exploring-ais-role-in-accessibility">View the transcript</a></p>]]></content><amg:twitter><![CDATA[I met up with Jeremy Osborne and Andrew Miller to talk about the benefits and harms of AI as it relates to accessibility.]]></amg:twitter><amg:summary><![CDATA[I met up with Jeremy Osborne and Andrew Miller to talk about the benefits and harms of AI as it relates to accessibility.]]></amg:summary><summary type="html"><![CDATA[<p>I met up with Jeremy Osborne and Andrew Miller to talk about the benefits and harms of AI as it relates to accessibility.</p>]]></summary><category term="accessibility" /><category term="AI/ML" /></entry><entry><id>https://www.aaron-gustafson.com/notebook/links/symbol-creator-ai/</id><title type="html"><![CDATA[🔗 Symbol Creator AI]]></title><link href="https://www.aaron-gustafson.com/notebook/links/symbol-creator-ai/" rel="alternate" type="text/html" /><link href="https://scai.globalsymbols.com/" rel="related" type="text/html" /><published>2025-04-07T22:14:51Z</published><content type="html" xml:base="https://www.aaron-gustafson.com"><![CDATA[<p>About a year ago, the folks at Global Symbols pitched me on their vision for using image generation models to create new AAC symbols that fit thematically within an existing set. It was a truly compelling use case for generative AI and I was thrilled to fund their project through the AI for Accessibility grant program.</p><p>Fast forward to today and their project has launched! Please check it out and share it with any AAC users in your life!</p>]]></content><amg:twitter><![CDATA[I am incredibly excited about this: crowdsourced & AI-assisted symbol generation for #AAC users. Now people can create the symbols they need in their lives. #NoGatekeepers]]></amg:twitter><category term="accessibility" /><category term="AI/ML" /></entry><entry><id>https://www.aaron-gustafson.com/appearances/podcasts/2025-04-02-exploring-ais-role-in-accessibility/</id><title type="html"><![CDATA[🎧 Exploring AI’s Role in Accessibility]]></title><link href="https://www.youtube.com/live/7ObB4jM-QXU" rel="alternate" type="text/html" /><published>2025-04-02T00:00:00Z</published><content type="html" xml:base="https://www.aaron-gustafson.com"><![CDATA[<p>I met up with Jeremy Osborne and Andrew Miller to talk about the benefits and harms of AI as it relates to accessibility.</p>]]></content><category term="accessibility" /><category term="AI/ML" /></entry><entry><id>https://www.aaron-gustafson.com/notebook/links/speech-accessibility-project-data-leads-to-recognition-improvements-on-microsoft-azure/</id><title type="html"><![CDATA[🔗 Speech Accessibility Project data leads to recognition improvements on Microsoft Azure]]></title><link href="https://www.aaron-gustafson.com/notebook/links/speech-accessibility-project-data-leads-to-recognition-improvements-on-microsoft-azure/" rel="alternate" type="text/html" /><link href="https://speechaccessibilityproject.beckman.illinois.edu/article/2025/01/31/speech-accessibility-project-data-leads-to-recognition-improvements-on-microsoft-azure" rel="related" type="text/html" /><published>2025-01-31T22:39:05Z</published><content type="html" xml:base="https://www.aaron-gustafson.com"><![CDATA[<p>This is the kind of work that keeps me excited about the potential of AI to meaningfully improve people’s lives. I’m so proud to be playing a small part in this project.</p>]]></content><amg:twitter><![CDATA[This is the kind of work that keeps me excited about the potential of AI to meaningfully improve people’s lives.]]></amg:twitter><category term="accessibility" /><category term="AI/ML" /></entry><entry><id>https://www.aaron-gustafson.com/speaking-engagements/expanding-accessibility-with-ai/</id><title type="html"><![CDATA[📢 Expanding Accessibility with AI]]></title><link href="" rel="alternate" type="text/html" /><published>2024-12-11T08:08:30Z</published><content type="html" xml:base="https://www.aaron-gustafson.com"><![CDATA[<p>This session, hosted by Aaron Gustafson and Ioana Tanase explores the transformative role of AI in enhancing accessibility. Together, you will uncover the pivotal role AI plays in crafting cutting-edge accessible technologies, learn about innovative AI tools that empower individuals with disabilities, and dive into best practices for creating inclusive AI solutions. Together, we will also explore the exciting future of AI in pushing the boundaries of accessibility.</p><p>Learning objectives:</p><ol><li>Understand the pivotal role AI plays in crafting cutting-edge accessible technologies.</li><li>Learn about innovative AI tools that empower individuals with disabilities.</li><li>Dive into best practices for creating inclusive AI solutions.</li><li>Explore the exciting future of AI in pushing the boundaries of accessibility</li></ol>]]></content><amg:twitter><![CDATA[This session, hosted by Aaron Gustafson and Ioana Tanase explores the transformative role of AI in enhancing accessibility. Together, you will uncover the pivotal role AI plays in crafting cutting-edge accessible technologies, learn about innovative AI tools that empower individuals with disabilities, and dive into best practices for creating inclusive AI solutions. Together, we will also explore the exciting future of AI in pushing the boundaries of accessibility.]]></amg:twitter><amg:summary><![CDATA[This session, hosted by Aaron Gustafson and Ioana Tanase explores the transformative role of AI in enhancing accessibility. Together, you will uncover the pivotal role AI plays in crafting cutting-edge accessible technologies, learn about innovative AI tools that empower individuals with disabilities, and dive into best practices for creating inclusive AI solutions. Together, we will also explore the exciting future of AI in pushing the boundaries of accessibility.]]></amg:summary><summary type="html"><![CDATA[<p>This session, hosted by Aaron Gustafson and Ioana Tanase explores the transformative role of AI in enhancing accessibility. Together, you will uncover the pivotal role AI plays in crafting cutting-edge accessible technologies, learn about innovative AI tools that empower individuals with disabilities, and dive into best practices for creating inclusive AI solutions. Together, we will also explore the exciting future of AI in pushing the boundaries of accessibility.</p>]]></summary><category term="accessibility" /><category term="AI/ML" /><category term="inclusive design" /><category term="the future" /><category term="user experience" /><category term="voice UX" /><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.aaron-gustafson.com/undefined" /></entry><entry><id>https://www.aaron-gustafson.com/notebook/links/steve-gleason-interview-with-jenny-lay-flurrie/</id><title type="html"><![CDATA[🔗 Steve Gleason interview with Jenny Lay-Flurrie]]></title><link href="https://www.aaron-gustafson.com/notebook/links/steve-gleason-interview-with-jenny-lay-flurrie/" rel="alternate" type="text/html" /><link href="https://www.youtube.com/watch?v=6zcGGdO4e98" rel="related" type="text/html" /><published>2024-05-01T21:21:35Z</published><content type="html" xml:base="https://www.aaron-gustafson.com"><![CDATA[<p>My boss, Jenny Lay-Flurrie, went to New Orleans to interview Steve Gleason about his new book and so much more. It was originally recorded for an internal interview series, but we’ve made it public because it’s such an amazing conversation. Well worth your time.</p>]]></content><amg:twitter><![CDATA[Love this conversation between @JennyLayFluffy and @SteveGleason about life, music, technology, and resilience. 😍]]></amg:twitter><category term="accessibility" /><category term="AI/ML" /><category term="inclusive design" /></entry><entry><id>https://www.aaron-gustafson.com/notebook/links/no-robots-txt-how-to-ask-chatgpt-and-google-bard-to-not-use-your-website-for-training/</id><title type="html"><![CDATA[🔗 No Robots(.txt): How to Ask ChatGPT and Google Bard to Not Use Your Website for Training]]></title><link href="https://www.aaron-gustafson.com/notebook/links/no-robots-txt-how-to-ask-chatgpt-and-google-bard-to-not-use-your-website-for-training/" rel="alternate" type="text/html" /><link href="https://www.eff.org/deeplinks/2023/12/no-robotstxt-how-ask-chatgpt-and-google-bard-not-use-your-website-training" rel="related" type="text/html" /><published>2024-04-01T20:52:49Z</published><content type="html" xml:base="https://www.aaron-gustafson.com"><![CDATA[<p>The Electronic Frontier Foundation (EFF) has you covered if you’d like to opt out of being indexed into tools like Open AI’s ChatGPT and Google’s Gemini. Just add these to your robots.txt file:</p><pre class="language-txt" tabindex="0"><code class="language-txt">User-agent: GPTBotDisallow: /User-agent: Google-ExtendedDisallow: /</code></pre><p>Building on this, you could exclude specific directories (e.g., where you keep your images):</p><pre class="language-txt" tabindex="0"><code class="language-txt">User-agent: GPTBotDisallow: /i/User-agent: Google-ExtendedDisallow: /i/</code></pre><p>I’ve decided to (for now at least) allow my text content to be indexed, but I may change my mind in the future.</p>]]></content><amg:twitter><![CDATA[Want to keep your site from being indexed by LLMs? ]]></amg:twitter><category term="AI/ML" /></entry></feed>