Accessibility audit
WCAG 2.2 AA, 12 October 2026: automated scans, the GOV.UK pattern tests and the NVDA screen reader on 112 pages.
An audit of the whole service against the Web Content Accessibility Guidelines 2.2 at level AA, carried out by the development team. It covers:
- the Self Assessment calculator
- payment plans, the tax so far this year, the Making Tax Digital helpers and customer accounts
- the 12 tax tools (18 question flows)
- the service overview and the developer API reference
It used automated and scripted checks, and the NVDA screen reader run through the pages and its speech recorded. It is not an independent specialist audit, and nobody who uses assistive technology every day took part. The section "What this audit did not cover" lists the gaps.
Summary
| Result | |
|---|---|
| The service's own pages (every journey, all 18 tool flows, at 320px, with text spacing, without JavaScript, in forced colours) | No definite failures of WCAG 2.2 AA |
| Screen reader (NVDA 2026.2 with Chrome), 112 pages: start pages, first questions, every error state, check your answers, results | Headings, questions, hints, error messages and "Change" links read correctly; two content problems found and fixed |
Developer API reference (/docs, Swagger UI) |
90 definite failures before the fixes; 90 definite failures before the fixes. After two rounds, one cause remains: Swagger UI puts each operation's controls inside its button (4.1.2), which is accepted for now and stated in the accessibility statement. Its 19px path links were then made 24px high; the release pipeline's accessibility stage re-checks the page on every run |
| Content style (GOV.UK style guide) | Long sentences and wording; the longest split, domain terms kept |
How it was tested
- Automated and scripted checks (GDS-Check).
- Every journey in
tests/gds_checkwas run in Chrome (Playwright 1.62.1, axe-core 4.13.0): 32 scans, including the calculator, payment plans, the tax so far, the Making Tax Digital helpers, accounts and organisation settings, the dummy services, and one journey for each of the 18 tool flows (scripts/make_gds_check_journeys.py, built fromtests/tool_flows.py). - Each page was rendered again at 320 pixels wide, with WCAG text spacing, without JavaScript, in forced colours and with reduced motion (--variants). - A crawl of up to 80 pages from the start page, and 40 from the service overview, tested the cross-page criteria: consistent navigation, identification and help, and multiple ways. It also wrote a WCAG-EM report. - Every error state was captured: an empty or wrong answer on the first question of each flow. - The GOV.UK pattern tests (
tests/test_govuk_patterns.py) on every question page of every flow. They check: - the page title matches the heading - there is a back link - an empty answer is refused, with an error summary whose links reach their fields - an error message is shown by the field - The NVDA screen reader, a portable NVDA 2026.2 driven by
tools/screen-reader/nvda_pass.mjs(Guidepup), in Chrome. For each journey it recorded the start page, the first question, every error state, "Check your answers" and the result: - the page read from the top in browse mode, as a person pressing the down arrow hears it - each form field reached with NVDA's F key
That was 112 pages over 22 journeys: every tool, the calculator, payment plans, the tax so far and the Making Tax Digital helpers. Pages read only in part were read again.
What was found and fixed
| Where | Finding | WCAG / guidance | Fix |
|---|---|---|---|
| All 12 tools | The header and page title named the Self Assessment service on, for example, the Universal Credit pages. NVDA reads the title first | 2.4.2 Page Titled; GOV.UK service navigation | Each feature's pages name the feature as the service, for example "Benefits", and the header links to its first page (Toolbox._render) |
| Child Benefit start page | "It takes around 1 minutes." | GOV.UK style | "1 minute" |
| Land Transaction Tax, non-residential lease page | The page title and the heading differed | 2.4.2, 2.4.6 | One wording: "What is the net present value of the rent?" (found when every tool flow was added to the pattern tests) |
| Tool intros and results | Sentences of 34 to 49 words (Inheritance Tax, Flat Rate Scheme, partnerships, Capital Gains Tax, Child Benefit) | GOV.UK style: 25 words at most | Split into shorter sentences |
API reference (/docs) |
No page language; landmarks; method labels and version labels below 4.5:1; copy buttons 0px wide; no visible focus on some controls; section headings skipping from h1 to h3; none of the service's help links | 3.1.1, 1.3.1, 1.4.3, 2.5.8, 2.4.7, 3.2.6 | Served through app/api_docs.py: lang, header, main and footer with the same help links, darker colours, 24px buttons, a GOV.UK-style focus, the section headings as level 2 |
Checked and not changed (false positives, or by design)
- Font size 0 on date questions (GDS-STY-05). GOV.UK Frontend sets
font-size: 0on.govuk-date-inputso that the day, month and year boxes sit together. The text is not 0 size. - The same question asked again (WCAG 3.3.7) on the partnership pages. Each partner has their own name, salary and share, so it is not redundant entry. The same flag on the Making Tax Digital "check before you send" helper is for an optional amount that was left empty in the earlier helper. Amounts that were given are filled in.
- Help in a different order (3.2.6) on the account pages. The account pages link to the privacy policy and terms in their text, and the scanner counted those links. The footer's help links are the same and in the same order on every page.
- One way to find content (2.4.5). The pages are steps in a process, which is exempt. The other pages are reached from the header's navigation and the start page.
- No back link on the result of an estimate, the admin sign-in page, the account dashboard and the dummy services. None of them is a step after a question.
- "Clickable" on the error summary and the first answer (NVDA). GOV.UK Frontend's JavaScript adds a click handler to the error summary, and NVDA announces it. The same happens on GOV.UK.
- NVDA reading the first answer twice on an error page. On 10 error pages NVDA read the first answer's label twice, for example "radio button, not checked, 6 April 2025 to 5 April 2026" and then the same words again. The markup is GOV.UK Frontend's own, unchanged. Three attempts to read GOV.UK's own example page for comparison were interrupted (the browser or another window took the focus from NVDA), so whether NVDA does the same on GOV.UK is not confirmed. It is left for the independent audit.
- Reading age and the words "purchase", "key" and "deliver" (content checks). The tax tools keep HMRC's own terms where its forms use them: "purchases" in a VAT return's boxes, and the "purchase" in Stamp Duty Land Tax. "Key" is an API key. The reading age of tax content was reviewed page by page: the longest sentences were split, and the rest uses the terms customers see on HMRC's forms.
Still to fix
- The API reference (
/docs). Swagger UI puts each operation's controls inside its button (WCAG 4.1.2). It is accepted for now indocs/approvals/accepted-findings.json, with the reason, and stated in the accessibility statement. Replace Swagger UI, or publish the reference somewhere else, before the service goes public. - Update, later on 12 October 2026: fixed. The control inside each operation's button was Swagger UI's deep link to that operation. With deep links switched off (
app/api_docs.py), the button has nothing interactive inside it and axe no longer reports nested controls. The acceptance was removed and the accessibility statement no longer lists it. - The first answer read twice by NVDA on error pages (above). Confirm it in the independent audit.
What this audit did not cover
- Other screen readers.
- JAWS (paid; the most used screen reader with NVDA)
- VoiceOver on a Mac or iPhone
- TalkBack on Android
This computer runs Windows and none of these was available. - Speech recognition (Dragon) and screen magnifiers (ZoomText). - Testing with disabled people. GOV.UK's Service Manual asks for disabled people in user research. That needs real participants, recruited for example through the GOV.UK accessibility empathy lab or a specialist agency. - An independent audit by an accessibility specialist, as GOV.UK service assessments expect before a service goes public. - Welsh. The service is not yet available in Welsh. - Cognitive accessibility beyond the content checks: for example, how people with memory or attention difficulties manage the longer flows. This needs research with people.
Evidence
Kept on the development computer and not committed, because they are large and the screen reader transcripts include whatever else was on the screen:
reports/gds-check/audit-2026-10-12/: every scan's HTML and JSON report, the WCAG-EM report (wcag-em.jsonld) andsummary.jsonafter-fixes/: the re-scans after the fixesreports/screen-reader/nvda-2026-10-12/: the NVDA transcript of each journey (transcript.md), withrerun/
Run them again with scripts/make_gds_check_journeys.py, the GDS-Check scanner, and
tools/screen-reader/nvda_pass.mjs (see its README).