Superseded. This is the report dated October 17, 2026, as issued. The current report is the October 22, 2026 re-evaluation, made after a screen reader demo video was added to pages in this report's sample and /free-test joined the sample. Since issue, this page has moved to its own address and gained a distinct title and this notice, and its change log says what changed on October 22. The evaluation is unchanged.
Product and vendor information
Changes since the prior report
This report is a re-evaluation. The prior report is dated October 11, 2026, published at https://brianbeals.com/conformance-report-2026-10-11b.html. Every page and document below was evaluated again against the site as it stood on October 17, 2026.
What changed on the site
- 34 pages were evaluated in the prior report and 38 in this one.
- Pages added since the prior report: /accessibility/before-we-start, /accessibility/federal, /accessibility/pricing, /accessibility/title-ii, /scanner, /writing/the-form-that-sets-the-price.
- Pages no longer found: /capability-statement-state-local.html, /capability-statement.html.
- 4 of the 4 published documents were revised after the prior scan and were validated again: Accessibility practice, ADA Title II; Accessibility practice, federal Section 508; Accessibility practice, Section 504 healthcare; Accessibility practice, Maryland CATS+.
- Document no longer linked: Federal, SDVOSB.
- Document no longer linked: Florida state and local, VBE.
- The five added pages went up on these dates: /accessibility/federal on October 12, /accessibility/pricing and /accessibility/before-we-start on October 15, /accessibility/title-ii, the ADA Title II program page, on October 16, and /scanner, About our scanners, the page the firm's two scanners link to from their User-Agents, on October 17. On October 16 the two general capability statements (AI, analytics and automation), capability-statement.html and capability-statement-state-local.html, and their two PDFs were removed from the site's navigation and sample. They remain reachable only by direct link, so with the October 17 essay the sample is 38 pages and four documents.
- The site now has two forms: the readiness checklist on /accessibility/before-we-start, from October 15, and a contact form on /contact, from October 16. Four criteria that had no form to judge now do: 1.3.5, 3.2.2, 3.3.1 and 3.3.3 move from Not Applicable to Supports, after a keyboard pass over each form's empty, corrected and sent states.
- On October 16 the site header became a navy bar with the firm name, the navigation and a call link, pinned to the top of wide windows and of phones held upright, and scrolling away in landscape and at high zoom, with the navigation under a Menu button below 1024 pixels; the homepage was rewritten, its three service cards each a single link covering the card; every page heading moved onto shared components and one type scale; and the light-mode error red darkened from #C0392B to #A93226, which measured 4.21:1 at the darkest point of the page background and now measures 5.14:1. /about was rewritten to lead with the accessibility practice, and four essays changed bylines. Every page was rescanned in both color schemes after these changes.
- /tools/account-intel was retired on October 15. The private area is now /desk, behind the same sign-in, and the scope line names it.
- The second October 11 report moves to /conformance-report-2026-10-11b.html so this report's citation resolves, and is listed in both site maps.
- On October 17 the sentence period moved outside the bold run in six labels on /accessibility/federal, /accessibility/before-we-start and the two forms' error messages, where VoiceOver on macOS 27 had spelled the next word letter by letter.
- On October 17 the error summary on both forms was rebuilt after a screen reader listening pass: focus now moves to a "There are N problems" heading that names every error, and each error is a link naming the field and the fix that moves focus to it. The homepage's trust strip became a list of four items, and every page title other than an essay's now ends "| Brian Beals, LLC".
- The Form That Sets the Price, an essay published on October 17, joins the sample, which is now 38 pages and four documents.
What changed in the verdicts
- 1.3.5 Identify Input Purpose: Not Applicable in the prior report, Supports in this one.
- 3.2.2 On Input: Not Applicable in the prior report, Supports in this one.
- 3.3.1 Error Identification: Not Applicable in the prior report, Supports in this one.
- 3.3.3 Error Suggestion: Not Applicable in the prior report, Supports in this one.
What the screen reader pass added
No new hand pass. The pass by Brian Beals on October 8, 2026 across 12 page(s), cited in the prior report, is carried forward; any re-listening or scripted runs since are in the method line. The criteria it decides:
- 1.3.1 Info and Relationships: Supports, as in the prior report.
- 2.4.1 Bypass Blocks: Supports, as in the prior report.
- 2.4.6 Headings and Labels: Supports, as in the prior report.
- 4.1.2 Name, Role, Value: Supports, as in the prior report.
- 4.1.3 Status Messages: previously decided by the scan and the keyboard checklist; the scripted captures in both readers and Brian Beals by ear in NVDA heard it and confirm the prior Supports.
Change log
Changes to the site after this report was issued that do not change any result. A change that alters a result means a new report.
- October 18, 2026: Text backgrounds made solid so contrast is machine-verifiable; no conformance change.
- October 18, 2026: The four accessibility capability statements now carry the one-page content in both formats. Each PDF was validated again against PDF/UA-1 with veraPDF and each HTML page rescanned with no violations; no conformance change.
- October 18, 2026: Found that three criteria tables in this report could not be scrolled by keyboard at 320px (2.1.1). Fixed the same day; re-scanned with no violations. No conformance results changed.
- October 22, 2026: A screen reader demo video, with a captions track, a described transcript beside each player and audio description in the narration, was added to /free-test and then to the home page and /accessibility. The home page and /accessibility are in this report's sample, so its Not Applicable results for 1.2.1 to 1.2.5 and 1.4.2, which rested on there being no audio or video, no longer described them. A change that alters a result means a new report: the October 22, 2026 re-evaluation decides those criteria with the video in the sample, and adds /free-test.
Applicable standards
WCAG 2.1 Level A and AA, all 50 criteria. Section 508 incorporates WCAG 2.0 Level AA, a strict subset, so conformance below satisfies it. ADA Title II adopts WCAG 2.1 Level AA directly. Level AAA was not evaluated.
Evaluation methods used
- Automated rule checking with axe-core 4.10.2, plus checks it does not carry: contrast under both color schemes, reflow measured by geometry at a real 320 pixel viewport, and focus visibility under a real keyboard press.
- 4 document(s) validated against ISO 14289-1 (PDF/UA-1) with veraPDF, the reference validator, and all 4 pass. Only validator rules that map to a WCAG success criterion are reported here; PDF/UA is a wider standard than the one this report applies. On October 11, 2026, Brian Beals read the ADA Title II capability statement end to end with NVDA 2026.2 in Acrobat Reader on Windows 11; headings announced as headings, reading order followed the page, the company data table read with its headers, and the footer came last. On October 15 the four accessibility statements were rebuilt as one-page letter sheets by the same renderer; the two general statements were removed from the site's navigation and sample on October 16, remain reachable only by direct link, and are outside the evaluation. All four in the sample pass veraPDF.
- 23 criteria that cannot be settled by the automated rules were evaluated by Brian Beals, October 8–17, 2026, with automated testing (axe-core) and manual review: keyboard, 400% zoom and reflow, and VoiceOver with Safari on macOS, plus PDF/UA validation with veraPDF, reviewed and signed by Brian Beals 2026-10-17. Recorded in verify-2026-10-17.yml, retained with the scan findings so this report can be reproduced.
- Screen readers used, by hand and by scripted capture: VoiceOver on macOS 27.0 and NVDA 2026.2 on Windows 11. Screen reader testing with VoiceOver on macOS 27.0 in Safari 27.0.1, by Brian Beals on October 8, 2026, across 12 page(s). Each page was checked for reading from the top, the skip link, landmark navigation, heading navigation, the links list, and how the brand mark is announced. This was a full pass: every check in the protocol was run on every one of those pages, none skipped or sampled. This pass decided 1.3.1, 2.4.1, 2.4.6, 4.1.2; the scripted captures in both readers and Brian Beals by ear in NVDA decided 4.1.3; results by page are tabled below. The skip link was also exercised by keystroke (Tab, Return, Tab) on all 12 pages with VoiceOver running in Safari, on October 8, 2026, by script (vo_capture.py, sending the keystrokes through System Events). On every page Tab announced the skip link, Return announced main, and the next Tab moved forward from the start of main rather than back into the navigation. Recorded in vo-capture-2026-10-08.yml. The full capture was repeated on the same 12 pages against the live site, reading every page from the top and pressing Tab, Return and Tab at the skip link, on October 10, 2026, by script (vo_capture.py and vo_analyze.py, keystrokes through System Events). All 84 checks agreed with the October 8 hand pass, 60 Pass and 24 not applicable, with nothing flagged. On the reorganized home page and /accessibility it also agreed with Brian Beals's by-ear re-listen the same day. Recorded in vo-capture-2026-10-10.yml. /tools/voice-critique joined the sample as its thirteenth page, the one template with a button and a status message, and was captured the same way, pressing Copy prompt, on October 10, 2026, by script (vo_capture.py and vo_analyze.py). Every check passed or did not apply. VoiceOver announced "Copy prompt button", and on each press, a second press inside two seconds included, announced "Prompt copied to the clipboard" from a status region while focus stayed on the button, which then read "Copied button". Recorded in vo-capture-2026-10-10.yml. /writing, after its topic filter was added, and /writing/eight-of-twenty-six, the first essay with the practice byline and a topic caption, were captured the same way, pressing each filter button, on October 11, 2026, by script (vo_capture.py and vo_analyze.py, keystrokes through System Events). Every check passed or did not apply. On /writing VoiceOver announced each filter as a toggle button, the active one "selected", and on each press announced the count shown from a status region, "Showing 1 essay, Accessibility." among them, with focus left on the button. Recorded in vo-capture-2026-10-11.yml. The home page and /accessibility, after the SBA certification mark was added to the footer and to the firm block, were captured the same way, on October 11, 2026, by script (vo_capture.py and vo_analyze.py, keystrokes through System Events). Every check passed or did not apply. In the footer, inside the content information landmark, VoiceOver announced the mark as "SBA certified service-disabled veteran-owned small business image", then the certification and registration lines, then "Capability statements" as a link; on /accessibility the firm block read the same way, with "VetCert search" and "SAM" as links. Brian Beals then listened by ear to the footer on one page and heard the mark announced with the same alt text, word for word. Recorded in vo-capture-2026-10-11b.yml. The Menu button that holds the main navigation below 1024 pixels, in Safari at 400 pixels wide: Tab to it, open it with Space, Tab into the list, close it with Escape, reopen and close again on October 16, 2026, by script (vo_capture.py helpers, keys through System Events) with VoiceOver on macOS 27.0. VoiceOver announced "Menu collapsed button", then "Menu expanded button" on opening with focus left on the button; Tab moved to "Home" in a list of 6 items, then "Services"; Escape announced "Menu collapsed button" with focus back on the button, and the same again after reopening. Recorded in vo-menu-2026-10-16.txt. A listening pass over the homepage, /contact, /accessibility/before-we-start, /writing, /writing/eight-of-twenty-six and /scanner: each page read from the top, the homepage's header, service cards and Menu button by keyboard, every field of both forms announced, both forms submitted empty and then once with marked test data, and the headings rotor on /writing, the essay and /scanner on October 17, 2026, by Brian Beals, by ear, listening live; driven by script (the VoiceOver cursor and macOS accessibility focus, every keypress checked to land inside the page), VoiceOver on macOS 27, default voice and rate, in a Safari Private window, so no browser extensions ran. Every label, state and heading matched the page; Brian Beals confirmed by ear the one announcement the transcript missed, the Email field on /contact, read as it appears on screen. Both test submissions announced their status ("Sending…", "Sending the checklist") and moved focus to the confirmation heading ("Message received", "Checklist received"). Two defects were heard and fixed the same day: the homepage's trust strip ran its four items together, and is now a list read as four items; the error summary on both forms was announced only as "3 answers need attention and 1 more item group". It took three versions, each heard by ear: a focused box with role="alert" read "There are 3 problems and 1 more item alert"; the list as the heading's description read only the first error; the final version, whose heading's accessible name carries every error, reads them all on arrival. Recorded in deliverables/draft-2026-10-16/voiceover-by-ear-2026-10-17/ (one transcript per page and SUMMARY.md). NVDA 2026.2 on Windows 11 in Microsoft Edge 155.0.4283.45 and Google Chrome 155.0.8059.40, by Brian Beals on October 10, 2026. Brian Beals listened by ear in Edge to the same 12 pages, each read from the top with NVDA's say all, ten of them to the end and two in part (/accessibility/healthcare and /conformance-report.html), and recorded 60 Pass and 24 not applicable, the same results as the VoiceOver hand pass. Say all presses no keys, so the skip link and NVDA's heading, link, form field and landmark lists were exercised by the scripted capture, not by hand. On October 11 he listened by ear in Edge to /tools/voice-critique, pressed Copy prompt more than once, and heard the button announced and "Prompt copied to the clipboard" on every press. The same 12 pages, and /tools/voice-critique, were captured by script in both browsers (nvda_capture.py and nvda_analyze.py, keys sent through NVDA's own gesture framework), reading line by line from the top, pressing Tab, Return and Tab at the skip link, and walking NVDA's heading, link, form field, landmark and button navigation. In each browser all 84 checks on the 12 pages agreed with the October 8 VoiceOver hand pass, with nothing flagged, and NVDA and VoiceOver disagreed on no check across all 13. On /tools/voice-critique, NVDA announced "Prompt copied to the clipboard" on each press of Copy prompt in both browsers, a second press inside two seconds included. Those captures predate the topic filter on /writing; it and /writing/eight-of-twenty-six were heard in VoiceOver. Recorded in nvda-log-2026-10-10-edge.txt, nvda-log-2026-10-10-chrome.txt and NVDA-Pass_2026-10-10.xlsx.
Screen reader testing
| Page | What was tested | Result | Notes |
|---|---|---|---|
| / | reading from the top, the skip link, landmark navigation, heading navigation, the links list, how the brand mark is announced | Pass | Every check passed or did not apply on October 8. Re-heard by Brian Beals on October 10 after the page was reorganized, heading outline included, with no problem found; the scripted capture the same day agrees. Heard again by ear by Brian Beals on October 17, 2026 in its rebuilt layout: each service card spoken once, the Menu button collapsed, expanded and closed by Escape, and the trust strip, after that day's fix, read as a list of four items. |
| /about | reading from the top, the skip link, landmark navigation, heading navigation, the links list, how the brand mark is announced | Pass | Every check passed or did not apply. |
| /accessibility | reading from the top, the skip link, landmark navigation, heading navigation, the links list, how the brand mark is announced | Pass | Every check passed or did not apply on October 8. Re-heard by Brian Beals on October 10 after the Services and Common questions sections were added, heading outline included, with no problem found; the scripted capture the same day agrees. |
| /accessibility/healthcare | reading from the top, the skip link, landmark navigation, heading navigation, the links list, how the brand mark is announced | Pass | Every check passed or did not apply. |
| /contact | reading from the top, the skip link, landmark navigation, heading navigation, the links list, how the brand mark is announced | Pass | Every check passed or did not apply. Heard again by ear by Brian Beals on October 17, 2026: every field announced with its label and required state, the error summary read in full after an empty submit, and a test message announced "Sending…" then "Message received" with focus moved there. |
| /documents | reading from the top, the skip link, landmark navigation, heading navigation, the links list, how the brand mark is announced | Pass | Every check passed or did not apply. |
| /writing | reading from the top, the skip link, landmark navigation, heading navigation, the links list, how the brand mark is announced | Pass | Every check passed or did not apply on October 8. On October 11 the page gained a topic filter, four toggle buttons with a status message. Brian Beals re-heard it by ear with VoiceOver; each button announced as a toggle button with its state, and each press announced the count shown. The scripted capture the same day agrees. Heard again by ear by Brian Beals on October 17, 2026: the headings rotor read "Writing", "Essays" and every essay title at level 3. |
| /writing/who-could-afford-to-find-out | reading from the top, the skip link, landmark navigation, heading navigation, the links list, how the brand mark is announced | Pass | Every check passed or did not apply. The mark check crossed the header lockup, where no mark is announced. The essay byline's mark further down was exposed as an image named "Brian Beals" at the time of the pass and was hidden after it; that change is verified in the accessibility tree, not by ear. |
| /writing/eight-of-twenty-six | reading from the top, the skip link, landmark navigation, heading navigation, the links list, how the brand mark is announced | Pass | Added October 11, the first essay with the practice byline and a topic caption. Every check passed or did not apply. Heard again by ear by Brian Beals on October 17, 2026: the headings rotor and the opening sections. |
| /sitemap-page | reading from the top, the skip link, landmark navigation, heading navigation, the links list, how the brand mark is announced | Pass | Every check passed or did not apply. |
| /conformance-report.html | reading from the top, the skip link, landmark navigation, heading navigation, the links list, how the brand mark is announced | Pass | Every check passed or did not apply. Tested as published on the morning of October 8, 2026, which was the August 30 report. This re-evaluation is generated from the same template with three additions: the changes section, the screen reader table, and a site map link in the footer. |
| /capability-statement-accessibility.html | reading from the top, the skip link, landmark navigation, heading navigation, the links list, how the brand mark is announced | Pass | Every check passed or did not apply. A standalone document: banner, main and contentinfo landmarks, no navigation landmark. |
| /capability-statement-state-local.html | reading from the top, the skip link, landmark navigation, heading navigation, the links list, how the brand mark is announced | Pass | Every check passed or did not apply. A standalone document: banner, main and contentinfo landmarks, no navigation landmark. On October 16, 2026 this page was removed from the site's navigation and sample and remains reachable only by direct link, so it is outside this evaluation; the record of hearing it stands with the October 8 pass. |
| /tools/voice-critique | reading from the top, the skip link, landmark navigation, heading navigation, the links list, how the brand mark is announced, the button and its status message | Pass | Added October 10, the one template with a button and a status message. Captured by script with VoiceOver in Safari and NVDA in Edge and Chrome; every check passed or did not apply in all three. On Copy prompt each reader announced "Prompt copied to the clipboard" from a status region on every press, a second press included, while focus stayed on the button. On October 11 Brian Beals listened by ear in NVDA with Edge and heard Copy prompt announced and the message on every press. |
Scope. The sample is the public site; /login, the sign-in page, and /desk, the private reference behind it with its documents and dashboards, which requires sign-in, are outside the evaluation. The two general capability statements (AI, analytics and automation) and their two PDFs were removed from the site's navigation and sample on October 16 and remain reachable only by direct link; they are outside the evaluation too. Screen reader testing covered 14 pages, one per template, so every page on the site shares a template with a tested page. The two pages with forms, /accessibility/before-we-start and /contact, the rebuilt homepage, /writing, /writing/eight-of-twenty-six and /scanner were heard again by ear on October 17, 2026; the October 17 essay, /writing/the-form-that-sets-the-price, uses the tested essay template. Two readers on two operating systems, by hand and by scripted capture: VoiceOver on macOS 27.0 in Safari 27.0.1, NVDA 2026.2 on Windows 11 in Edge 155 and Chrome 155. The two readers agreed on every check both heard. JAWS and mobile screen readers were not used. The site has no mobile app; VoiceOver on iOS and macOS read the same WebKit accessibility tree, and TalkBack and NVDA read the same one Chrome builds.
WCAG 2.1 Level A
| Criterion | Lvl | Conformance | Remarks and explanations |
|---|---|---|---|
| 1.1.1 Non-text Content | A | Supports | Every content image carries descriptive alt text: the principal's photograph on /about, and five wildlife and travel photographs on /elsewhere. The BB brand mark is hidden from assistive technology wherever it appears, including the site header on every page, because it sits beside text that already names the company. The homepage figure graphic, four people with one highlighted, is hidden too: the heading beside it says the same thing in words. The SBA service-disabled veteran-owned certification mark in every page footer and in the firm block on /accessibility carries meaning on its own and is exposed as an image with the alt text "SBA certified service-disabled veteran-owned small business". https://brianbeals.com: svg%3E marked decorative https://brianbeals.com/about: svg%3E marked decorative https://brianbeals.com/writing: svg%3E marked decorative |
| 1.2.1 Audio-only and Video-only (Prerecorded) | A | Not Applicable | No audio or video elements across 38 pages. |
| 1.2.2 Captions (Prerecorded) | A | Not Applicable | No audio or video elements across 38 pages. |
| 1.2.3 Audio Description or Media Alternative | A | Not Applicable | No audio or video elements across 38 pages. |
| 1.3.1 Info and Relationships | A | Supports | Landmarks on every page, one h1 per page, and no heading level skips across all 38 pages. Lists, definition lists, tables, the quotation on /accessibility/healthcare and the preformatted blocks on /writing/sixty-cents-a-year and /tools/voice-critique all use the matching element. The service tables on /accessibility/pricing and /accessibility/before-we-start mark column and row headers, and keep table roles when they stack into cards below 640 pixels. On the readiness checklist on /accessibility/before-we-start and the contact form on /contact, every field has a label; multiple-choice items and the contact form's email-or-phone pair are groups named by their question. No bold or oversized text stands in for a heading and no typed bullet stands in for a list. All four published documents are tagged, declare a language, carry a usable title, and label their figures. Screen reader: Landmarks and headings walked with the rotor on all 12 pages: each landmark announced once, exactly one level 1 heading per page, no skipped levels. On October 10 the scripted capture heard the same on all 12 pages, including the reorganized home page and /accessibility, and on /tools/voice-critique. Landmarks present, one h1 per page, no heading level skips. All 4 document(s) evaluated are tagged, declare a language, carry a usable title, and label their figures. All 4 were also validated against ISO 14289-1 with veraPDF and raised nothing that maps to a success criterion. |
| 1.3.2 Meaningful Sequence | A | Supports | Settled by listening. On October 8, 2026 Brian Beals read the newest essay, /writing/who-could-afford-to-find-out, and /capability-statement-accessibility-healthcare.html straight through with VoiceOver on macOS 27 in Safari; the spoken order carries the same meaning as the visual layout, including the statement's main column then sidebar. The remaining pages were checked by comparing source order with visual order: no CSS reordering anywhere, and the October 16 and 17 keyboard pass moved strictly down all 38 pages. On the readiness form each question comes before its answer in source order, as it does on screen. Not determinable by scanning. |
| 1.3.3 Sensory Characteristics | A | Supports | No instruction depends on shape, size, position, or sound. Every positional word on the 38 pages either describes prose rather than instructing, or points to content that follows in reading order, as in "copy the prompt below" on /tools/voice-critique, where the prompt is the next item and the button is named Copy prompt. Required fields on the readiness form say "(required)" in their labels. Not determinable by scanning. |
| 1.4.1 Use of Color | A | Supports | Color is never the sole carrier of meaning. Links inside running text are underlined. The links on /writing are whole cards in a list rather than links inside a sentence. On both forms a field in error gets a red border and also a text message beside it and in a summary at the top, and required fields are marked in words. The items that change the fee on /accessibility/before-we-start are labelled "Blocker" in text as well as in red. The green stripe under the header and the green figure on the homepage are decoration and carry no information. Not determinable by scanning. |
| 1.4.2 Audio Control | A | Not Applicable | No audio or video elements across 38 pages. |
| 2.1.1 Keyboard | A | Supports | Every interactive element is a native link, button or form control, and each was reached by Tab on all 38 pages. Below 1024 pixels the main navigation sits under a native Menu button, opened with Enter or Space, with Tab moving straight into its links and Escape closing it. On /tools/voice-critique the Copy prompt button is native, and the scrollable prompt beside it takes focus so it can be scrolled from the keyboard. On both forms every field and the send button were reached and operated from the keyboard, including following each link in the error summary to its field. No click handlers sit on non-interactive elements. All interactive elements are native and focusable. |
| 2.1.2 No Keyboard Trap | A | Supports | On October 16, 2026 (October 17 for /scanner and the October 17 essay), on each of the 38 pages, Tab was pressed from the top through every focusable element until focus left the page, then Shift+Tab walked back the same way; the two counts matched on every page. Focus never stuck. No page carries a modal, an iframe, or a third-party embed. Not determinable by scanning. |
| 2.1.4 Character Key Shortcuts | A | Not Applicable | No single-character key shortcuts. The site's source registers no keyboard handler of its own on any page. Not determinable by scanning. |
| 2.2.1 Timing Adjustable | A | Not Applicable | No time limits. No session timeout, auto-advancing content, meta refresh, or media anywhere. The Copy prompt button's label reverts two seconds after a copy, which confirms an action and does not limit the user. The readiness form never rejects a slow or a fast submission. Not determinable by scanning. |
| 2.2.2 Pause, Stop, Hide | A | Not Applicable | No animated, moving, or auto-updating content. |
| 2.3.1 Three Flashes or Below Threshold | A | Supports | No animation anywhere, so nothing can flash. |
| 2.4.1 Bypass Blocks | A | Supports | Screen reader: On all 12 pages the skip link was the first Tab stop, Return moved to the main landmark, and the next Tab landed inside main rather than back in the header. The October 10 scripted capture repeated it by keystroke on all 12 pages with the same result, and on /tools/voice-critique. Skip link present, first in tab order, target exists and is focusable. |
| 2.4.2 Page Titled | A | Supports | All 38 pages carry a unique, non-empty title. All 4 document(s) evaluated are tagged, declare a language, carry a usable title, and label their figures. All 4 were also validated against ISO 14289-1 with veraPDF and raised nothing that maps to a success criterion. |
| 2.4.3 Focus Order | A | Supports | No positive tabindex anywhere. On all 38 pages the October 16 and 17 keyboard pass moved forward through source order. Below 1024 pixels focus goes from the firm name to the Menu button; when the menu is open, the next Tab is its first link, and Escape returns focus to the button. On the homepage each service card is one link, its heading, so Tab stops once per card. On /contact focus goes through the form to its send button, then up to the column of other ways to reach Brian beside it, the order the page is written in. The header stays pinned at the top on wide windows and on phones held upright; tabbing forward and back on long pages at desktop and phone sizes, no focused element was ever behind it, and a focused service card's whole outline stays clear of it. When either form reports errors, focus moves to the heading of the error summary at the top of the form; after a send it moves to the confirmation heading. No positive tabindex anywhere; DOM order governs. |
| 2.4.4 Link Purpose (In Context) | A | Supports | Every repeated link name resolves to one destination, so each has a single unambiguous purpose. Consistent naming across routes is required by 3.2.4. https://brianbeals.com: 'Book a 15-minute call' repeats, all to https://brianbeals.com/contact https://brianbeals.com/accessibility/title-ii: 'Book a 15-minute call' repeats, all to https://brianbeals.com/contact |
| 2.5.1 Pointer Gestures | A | Not Applicable | No path-based or multipoint gesture detected: no touch or motion handlers, draggable elements, slider roles, or map containers. |
| 2.5.2 Pointer Cancellation | A | Supports | All pointer interaction is standard activation on native links, buttons and form controls. The site's source registers no mouse-down, pointer-down, or touch handler. Not determinable by scanning. |
| 2.5.3 Label in Name | A | Supports | Every aria-label contains its element's visible text, so speech input users can target controls by what they see. |
| 2.5.4 Motion Actuation | A | Not Applicable | No device motion handler detected: no touch or motion handlers, draggable elements, slider roles, or map containers. |
| 3.1.1 Language of Page | A | Supports | lang set on all 38 pages. All 4 document(s) evaluated are tagged, declare a language, carry a usable title, and label their figures. All 4 were also validated against ISO 14289-1 with veraPDF and raised nothing that maps to a success criterion. |
| 3.2.1 On Focus | A | Supports | Confirmed during the October 16 and 17 keyboard pass on all 38 pages: the address never changed and no content appeared while focus moved. Nothing navigates, opens, or submits on focus. Not determinable by scanning. |
| 3.2.2 On Input | A | Supports | Two forms, the readiness checklist and the contact form. Choosing a radio button or checkbox, or typing in a field, changes nothing else on the page; each form is sent only by its own send button. Not determinable by scanning. |
| 3.3.1 Error Identification | A | Supports | Both forms were submitted empty and part-filled, from the keyboard, in a test build that does not send. Each missing or wrong answer was reported in text beside its field, naming what is wrong ("Enter your name.", "Enter a phone number with its area code."), and in a summary at the top of the form. Since October 17 focus moves to the summary's heading, "There are 3 problems", whose accessible name carries every error, and each error is a link naming the field and the fix ("How to reach you: enter an email address or a phone number, so I can reply") that moves focus to the field. Heard by ear by Brian Beals on October 17, 2026 in VoiceOver on macOS 27 in Safari: "heading level 2 There are 3 problems. Name: enter your name. How to reach you: enter an email address or a phone number, so I can reply. Message: enter a message." Fields in error carry aria-invalid and are described by their message. On the contact form, an empty email and phone are one error that belongs to both, so both fields are marked and both are described by it. Not determinable by scanning. |
| 3.3.2 Labels or Instructions | A | Supports | Every form control carries a label or an explicit accessible name. |
| 4.1.1 Parsing | A | Supports | No duplicate id values. Obsolete and removed in WCAG 2.2. Reported for 2.1 completeness only. |
| 4.1.2 Name, Role, Value | A | Supports | Screen reader: Every link in the rotor's link list announced a name and the link role on all 12 pages. On October 8 no page in the sample had a form control or a control with state, so name, role, and value were heard for links only. The October 10 scripted capture heard every link on all 12 pages announced with a name, and nothing announced itself as a control with state. On /tools/voice-critique, added the same day, VoiceOver and NVDA announced the one button by name and role, "Copy prompt button". On October 11 the topic filter on /writing added four toggle buttons; VoiceOver announced each by name, role, and pressed state ("All selected toggle button"), by ear and by scripted capture. Every control has a non-empty accessible name in the browser accessibility tree. Custom widget state needs AT confirmation. Scan reads the real accessibility tree. Custom widgets still need AT confirmation of state changes. |
WCAG 2.1 Level AA
| Criterion | Lvl | Conformance | Remarks and explanations |
|---|---|---|---|
| 1.2.4 Captions (Live) | AA | Not Applicable | No audio or video elements across 38 pages. |
| 1.2.5 Audio Description (Prerecorded) | AA | Not Applicable | No audio or video elements across 38 pages. |
| 1.3.4 Orientation | AA | Supports | No CSS locks or rotates content by orientation. |
| 1.3.5 Identify Input Purpose | AA | Supports | Both forms collect the user's own details with their input purpose: on the contact form autocomplete name, organization, email and tel; on the readiness checklist name, organization-title and email, with url on the domain field. The checklist's other fields ask about the organization's website, not the user, and are marked autocomplete off. Not determinable by scanning. |
| 1.4.3 Contrast (Minimum) | AA | Supports | Zero failures across 38 pages in both color schemes. |
| 1.4.4 Resize Text | AA | Supports | No viewport restriction on zoom, and no fixed-height text containers (confirmed by the 1.4.12 spacing override producing no clipping). |
| 1.4.5 Images of Text | AA | Supports | The images in the evaluated set are photographs (the principal on /about, five wildlife and travel photographs on /elsewhere), the BB brand mark, the homepage figure graphic, which contains no text, and the SBA certification mark in the footer and the capability statements. The two marks are logotypes and exempt; the SBA mark is used as SBA supplies it, and its words are also given as text beside it. No other text is presented as an image anywhere in the evaluated set. Not determinable by scanning. |
| 1.4.10 Reflow | AA | Supports | No horizontal scrolling at a 320px viewport on any of 38 pages. |
| 1.4.11 Non-text Contrast | AA | Supports | Control borders and the focus indicator clear 3:1 in both color schemes, measured by the scan, including the fields, radio buttons and checkboxes on both forms and the Menu button's border on the navy header. No icon or state indicator carries meaning on its own. Control borders and focus indicator all clear 3:1. |
| 1.4.12 Text Spacing | AA | Supports | No clipping or scrolling with the 1.4.12 override values applied. |
| 1.4.13 Content on Hover or Focus | AA | Not Applicable | No content appears on hover or focus. On October 16, 2026 (October 17 for /scanner and the October 17 essay) every link and button on the 38 pages was hovered and focused in turn by script and nothing new appeared. There are no title tooltips, popovers, or dialogs. Not determinable by scanning. |
| 2.4.5 Multiple Ways | AA | Supports | A human-readable site map at /sitemap-page is linked from every one of the 38 pages evaluated, giving a second route to any page alongside the global navigation. |
| 2.4.6 Headings and Labels | AA | Supports | Headings were read as an outline on all 38 pages, and each names the section beneath it: the homepage's "What I test" and "What the documents show", essay headings in full phrases, capability statement headings naming their block (Company Snapshot, NAICS, Services). The headings moved onto shared components on October 16, 2026 with no change of wording beyond sentence case, and the homepage was rewritten the same day. So was /about, which dropped its "How I think about this work" section; its "Earlier" heading now covers the career and Navy paragraphs, and "Building in public" the projects. Field labels on both forms say what to enter. Screen reader: Heading lists heard out of context through the rotor on all 12 pages; each heading made sense read alone. No page in the sample has a form field. On October 10 Brian Beals re-heard the new heading outlines of the home page and /accessibility; each heading names its section. The scripted capture recorded the heading lists but does not judge their meaning. Not determinable by scanning. |
| 2.4.7 Focus Visible | AA | Supports | Visible focus indicator confirmed under a real keyboard press. |
| 3.1.2 Language of Parts | AA | Supports | No passage declares a language other than the page language. A passage in another language with no lang attribute cannot be detected by scanning; none was observed in review. |
| 3.2.3 Consistent Navigation | AA | Supports | The 29 site pages share one header from one component, in the same order on every page: the firm name linking home, the same six navigation links, and a Book a 15-minute call link. Below 1024 pixels the six links sit under a Menu button in the same place on every page. The four capability statements and the five conformance report pages are standalone documents with no navigation menu; each ends with a footer linking the site map. Not determinable by scanning. |
| 3.2.4 Consistent Identification | AA | Supports | Components with the same function carry the same name throughout: the skip link reads "Skip to main content" on all 38 pages, the site map link reads "Site map" on every page that carries one, the Menu button and the six navigation links are named identically on all 29 site pages, and the header's call link reads "Book a 15-minute call", or "Book a call" on screens narrower than 480 pixels, where its accessible name changes with the visible label. The homepage's own call button, which goes to the same page, has the full name. Not determinable by scanning. |
| 3.3.3 Error Suggestion | AA | Supports | Each error message on both forms says how to correct it: "Enter an email address or a phone number, so I can reply.", "Enter an email address like name@yourcity.gov.", "Choose at least one obligation, or Unsure." Not determinable by scanning. |
| 3.3.4 Error Prevention (Legal, Financial, Data) | AA | Not Applicable | The site takes no legal, financial, or data-modifying commitment. Both forms send a message by email, store nothing, and commit the sender to nothing. Not determinable by scanning. |
| 4.1.3 Status Messages | AA | Supports | Screen reader: On /tools/voice-critique, Copy prompt was pressed by the scripted capture in VoiceOver with Safari and in NVDA with Edge and Chrome. Each announced "Prompt copied to the clipboard" from a polite status region on every press, a second press inside two seconds included, with focus left on the button. On October 11 Brian Beals pressed Copy prompt by hand in NVDA with Edge and heard the message on every press. On /writing, each press of a topic filter announced the count shown from a status region with focus left on the button, heard by Brian Beals with VoiceOver on October 11 and by scripted capture the same day. 6 live region(s). All exist before their content, stay visible, and keep node identity when text changes. Announcement itself requires a screen reader. Scan verifies the DOM conditions that make an announcement possible. Hearing it requires a screen reader; the ACR states which was done. |
This is a self-assessment unless stated otherwise. It was not produced by an independent third-party auditor. A contracting officer requiring independent verification should request a third-party audit.