0.7.0: turning the accessibility audit on ourselves
The app that checks every prototype for accessibility got audited against WCAG 2.2 AA and Section 508 itself. What was found, fixed, and is still untested — stated honestly.
Since the first post in this series I've made one claim over and over: automated accessibility checks are a floor, not a ceiling, and a tool that generates public-service prototypes has to take that bar seriously. Version 0.7.0, out today, is what happened when I finally pointed that sentence at the app itself.
An audit of Prompt to Page's own interface — against WCAG 2.2 AA and Section 508, followed by keyboard testing against the macOS accessibility tree — and then the unglamorous weeks of fixing what it found. Which was a lot. This is the release where the tool takes its own medicine, and I want to write it up honestly, embarrassing parts included.
The confession that sets the tone
Here's the one that stung: until this release, the app could not be zoomed at all. An app whose entire purpose is accessible service prototypes offered a low-vision user no way to make its own interface larger. WCAG 1.4.4 — resize text — is about as basic as the standard gets, and the app that scans every generated page for contrast failures didn't meet it in its own chrome.
0.7.0 fixes that properly: ⌘+/⌘−/⌘0 (Ctrl on Windows) zoom the whole interface from 90% to 200%, there's an Interface zoom control in Settings, the choice is remembered, and at high zoom the layout reflows — the page list opens over the canvas, secondary tools fold away, the chat dock stays compact — instead of hiding the preview and calling that a layout.
I'm leading with this because it's the point of the whole release. If you build accessibility tooling, your own interface is where your claims go to be tested. Mine had gaps I preach about.
What the audit actually turned up
The full list is long (the changelog runs to it in detail), but the shape of it will be familiar to anyone who has done this work on a real app:
The keyboard couldn't reach everything. The flagship example: selecting a section to edit required a mouse click inside the preview. There's now a proper keyboard route — turn on Edit section and a Sections list opens beside the preview; arrow keys walk the page's sections with each one outlined and scrolled into view, Enter opens the same actions as a click, Escape backs out. Focus stopped getting lost too: panels return focus to the control that opened them, deleting a page keeps you in the page list, and the shortcuts finally work while focus is inside the preview.
Controls weren't named the way they look. Voice-control users say what they see — "click Map" — and several buttons had spoken names that didn't match their visible text, or no useful name at all. Buttons now keep one name and expose on/off as state; sections are named in words ("Heading (large)" instead of "Heading l", which screen readers read as "Heading el").
Screen readers were either starved or firehosed. Errors appeared silently; meanwhile generating a page could read the page's entire HTML aloud. Now a failed save or blocked setup is announced immediately, journey generation announces each page as it starts, downloads announce 25% steps — and a finished generation says "Page generated." plus the model's note, never the code.
Contrast failed in both themes. Light mode's success green and error red were too pale to read as text; dark mode had white text on near-white fills (1.04:1 on a primary button — genuinely invisible). Form fields had 1.3:1 edges. All now meet the ratios, including under Windows High Contrast, with a solid 2px focus outline everywhere there used to be a faint glow.
And one I'd never have found without testing on real input: on macOS, the Enter that confirms a Japanese, Chinese or Korean input-method conversion also counted as submit, so renaming a page or sending a prompt could commit half-converted text. Fixed — which matters rather a lot for an app that now ships a Japanese design system.
The statement, and what it honestly doesn't claim
0.7.0 ships an accessibility statement: the standard the app aims for (WCAG 2.2 AA), what has been tested, known limitations, and how to report a barrier. And here's the sentence in it I'm most attached to: these fixes have been checked with automated tests and by keyboard — not yet with a screen reader.
That's the same discipline as the "Not measured" labels on un-evaluated design systems, applied to ourselves. An accessibility statement that claims conformance it hasn't verified is worse than none. The keyboard work is tested; the screen-reader experience has been engineered — announcements, names, groupings — but not yet validated with real assistive-technology users, and the statement says so. Floor, then ceiling. Never one pretending to be the other.
The same principle now confronts users at the right moment: exports ask about accessibility first. Before a testable-prototype ZIP or Prototype Kit export, the app lists pages whose last check found open issues — or that haven't been checked since they changed — with a Review button into the Accessibility panel. You can export anyway; the list travels with the export warnings. And the Prototype Kit hand-off now includes an ACCESSIBILITY.md of the manual checks the prototype still needs. The floor gets checked automatically; the ceiling gets named explicitly and handed to a human.
The model can no longer spell a fake class
One more change deserves its own section, because it completes an argument I made months ago about refinement: you don't get reliability from an unreliable component by asking it more firmly — you make the mistake structurally impossible.
A local model's most common failure on GOV.UK and USWDS was always the class that looks right but doesn't exist — usa-button--primary, say. The validator caught these after the fact; a repair turn fixed them at the cost of a second generation. As of 0.7.0, on the built-in llama.cpp runtime, the model is held to the pack's own class list as it writes. It cannot spell a govuk- or usa- class that isn't on the list, because the invalid token sequence is simply not available to it. Persuasion didn't do this; construction did.
The measured result: models that already used only real classes scored the same, models that didn't stopped inventing them, at about the same speed. And the honest new limit, stated in the changelog because it's real: the list is the app's own, so a genuine class that's missing from it can no longer be written either. Constraints cut both ways; you should know the direction of both edges. (This applies to GOV.UK, USWDS and MOJ on llama.cpp for now — every other pack keeps the old behaviour until it's been checked on its own. Same rule as ever: no change ships to a pack it wasn't measured on.)
Japan, continued
The Digital Agency Design System pack grew up in this release too. Its page furniture is now actually Japanese — the prototype marker reads 架空・試作, the skip link 本文へ移動, each piece marked as Japanese so assistive technology switches language correctly. And six models now have measured quality levels on DADS, replacing "Not measured" — with the caveats attached: measured on English-content pages, before the native review of the pack's Japanese guidance, so a re-run is owed after it. The Japanese text is written by a non-native author and is listed for native review — an offer I'm still glad to take up if you're reading this from that community.
The thread through it all
Elsewhere in 0.7.0: journeys now take their questions from the answers your description lists rather than assuming every service wants a National Insurance number; starting a journey asks before regenerating over pages you designed (and keeps their Version history); pages with identical or non-Latin titles get unambiguous Paths; and a refinement says "Updated" only when the page actually changed — with an honest account of what was left alone and why.
Different features, one habit: say what was measured, say what wasn't, make the destructive path ask first, and where possible make the wrong thing impossible rather than discouraged. It turns out that when you point those habits at your own interface, they find just as much as they find in a generated page. That seems worth knowing about any tool that grades other people's work.
Prompt to Page 0.7.0 is live — free during the beta, macOS (Apple Silicon) and Windows. The in-app updater will offer it; the accessibility statement ships in the docs. If you use assistive technology and are willing to test the parts a keyboard can't, you are precisely the person I want to hear from.
Prompt to Page is an independent project by Courtney Allen. It is not affiliated with, endorsed by, or connected to the Government Digital Service, the NHS, the U.S. General Services Administration, the Digital Agency (Japan), the Crown, or any government body. Design systems are referenced descriptively; protected marks and restricted fonts are never bundled.
Try Prompt to Page.
Free during the closed beta. Generation runs on your machine.