An NVDA user presses Enter on "Select Seat Class" and hears nothing. The Sign In dialog opened silently, and their next Tab lands on the page behind it. Earshot turns that silence into a failing test: the verdict comes from what a real screen reader says, not from the AI agent judging its own code. On three apps I didn't write, lint and axe flagged 3½ of 15; IBM Bob fixed all 15, each verified by a real screen reader. The problem. AI coding agents write more and more UI. Tests check what sighted users see; linters check markup. No test in the AI agent's loop checks what a blind user hears. In WebAIM's 2026 scan of the top million pages, 95.9% had detectable WCAG failures. The European Accessibility Act has applied to e-commerce and passenger-transport booking since 28 June 2025, so for shops and airlines a silent dialog is a legal risk. The apps: IBM's Galaxium Travels, TodoMVC, and Uptime Kuma, a production monitoring tool with ~60,000 GitHub stars. Nothing was planted: the bugs are theirs (the audit is mine). The measurement. axe-core 4.13 flagged 3½, strict React lint none; 11 were caught only by ear. Bob's first F-01 fix added only the dialog's name: axe passed it, NVDA stayed silent, and Earshot rejected it. The solution. - Fix: /hear F-01 puts IBM Bob in a custom mode that can edit only the frontend. Bob states the expected announcement, fixes the code, then calls my MCP tool listen(), which presses real keys in Chrome while NVDA runs and returns its speech. A fix without the expected phrase is rejected; that happened six times. - Discover: /earshot tabs through a page by ear, parallel subagents locate the code, the human triages, Bob fixes and tests. On Uptime Kuma it found a silent Tab stop and a duplicate one inside every monitor link. - Gate: each verified finding becomes a test. A git hook and a Bob hook replay the tests a change can affect, with NVDA, including typing. Told to remove the dialog's focus code as a "tidy-up", Bob complied; NVDA heard silence and the git hook refused the commit; later the Bob hook blocked a --no-verify commit. Typing caught a regression in Bob's own verified F-01 fix, and Bob wrote the test. Why it is new. axe-core and axe's MCP server check rules. Guidepup and a11ign drive real screen readers for human-written tests or audits. Earshot puts the screen reader inside the AI agent's loop, so the agent's test oracle is what a blind user hears: an AI that rejects its own fix because it listened. Adoption. One git command enables the gate; each test is one JSON line; adding a new app took Bob one task; a verified fix cost a median of about 1 Bobcoin ($0.50); checking just 6 announcements by hand took me a minute per commit; the gate replays them unattended. Earshot proves specific announcements on specific key paths; it does not certify compliance.
Category tags: