Accessibility Conformance Report

brianbeals.com · VPAT® 2.5 WCAG Edition · October 17, 2026

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

Product
brianbeals.com
Report date
October 17, 2026
Vendor
Brian Beals, LLC
Contact
brian@brianbeals.com
Pages evaluated
38
Scan date
2026-10-17

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

What changed in the verdicts

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:

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.

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

Screen reader testing

Screen reader results by page
PageWhat was testedResultNotes
/reading from the top, the skip link, landmark navigation, heading navigation, the links list, how the brand mark is announcedPassEvery 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.
/aboutreading from the top, the skip link, landmark navigation, heading navigation, the links list, how the brand mark is announcedPassEvery check passed or did not apply.
/accessibilityreading from the top, the skip link, landmark navigation, heading navigation, the links list, how the brand mark is announcedPassEvery 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/healthcarereading from the top, the skip link, landmark navigation, heading navigation, the links list, how the brand mark is announcedPassEvery check passed or did not apply.
/contactreading from the top, the skip link, landmark navigation, heading navigation, the links list, how the brand mark is announcedPassEvery 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.
/documentsreading from the top, the skip link, landmark navigation, heading navigation, the links list, how the brand mark is announcedPassEvery check passed or did not apply.
/writingreading from the top, the skip link, landmark navigation, heading navigation, the links list, how the brand mark is announcedPassEvery 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-outreading from the top, the skip link, landmark navigation, heading navigation, the links list, how the brand mark is announcedPassEvery 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-sixreading from the top, the skip link, landmark navigation, heading navigation, the links list, how the brand mark is announcedPassAdded 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-pagereading from the top, the skip link, landmark navigation, heading navigation, the links list, how the brand mark is announcedPassEvery check passed or did not apply.
/conformance-report.htmlreading from the top, the skip link, landmark navigation, heading navigation, the links list, how the brand mark is announcedPassEvery 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.htmlreading from the top, the skip link, landmark navigation, heading navigation, the links list, how the brand mark is announcedPassEvery check passed or did not apply. A standalone document: banner, main and contentinfo landmarks, no navigation landmark.
/capability-statement-state-local.htmlreading from the top, the skip link, landmark navigation, heading navigation, the links list, how the brand mark is announcedPassEvery 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-critiquereading from the top, the skip link, landmark navigation, heading navigation, the links list, how the brand mark is announced, the button and its status messagePassAdded 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

Success criteria, Level A
CriterionLvlConformanceRemarks and explanations
1.1.1 Non-text ContentASupportsEvery 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)ANot ApplicableNo audio or video elements across 38 pages.
1.2.2 Captions (Prerecorded)ANot ApplicableNo audio or video elements across 38 pages.
1.2.3 Audio Description or Media AlternativeANot ApplicableNo audio or video elements across 38 pages.
1.3.1 Info and RelationshipsASupportsLandmarks 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 SequenceASupportsSettled 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 CharacteristicsASupportsNo 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 ColorASupportsColor 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 ControlANot ApplicableNo audio or video elements across 38 pages.
2.1.1 KeyboardASupportsEvery 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 TrapASupportsOn 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 ShortcutsANot ApplicableNo 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 AdjustableANot ApplicableNo 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, HideANot ApplicableNo animated, moving, or auto-updating content.
2.3.1 Three Flashes or Below ThresholdASupportsNo animation anywhere, so nothing can flash.
2.4.1 Bypass BlocksASupportsScreen 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 TitledASupportsAll 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 OrderASupportsNo 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)ASupportsEvery 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 GesturesANot ApplicableNo path-based or multipoint gesture detected: no touch or motion handlers, draggable elements, slider roles, or map containers.
2.5.2 Pointer CancellationASupportsAll 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 NameASupportsEvery aria-label contains its element's visible text, so speech input users can target controls by what they see.
2.5.4 Motion ActuationANot ApplicableNo device motion handler detected: no touch or motion handlers, draggable elements, slider roles, or map containers.
3.1.1 Language of PageASupportslang 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 FocusASupportsConfirmed 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 InputASupportsTwo 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 IdentificationASupportsBoth 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 InstructionsASupportsEvery form control carries a label or an explicit accessible name.
4.1.1 ParsingASupportsNo duplicate id values. Obsolete and removed in WCAG 2.2. Reported for 2.1 completeness only.
4.1.2 Name, Role, ValueASupportsScreen 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

Success criteria, Level AA
CriterionLvlConformanceRemarks and explanations
1.2.4 Captions (Live)AANot ApplicableNo audio or video elements across 38 pages.
1.2.5 Audio Description (Prerecorded)AANot ApplicableNo audio or video elements across 38 pages.
1.3.4 OrientationAASupportsNo CSS locks or rotates content by orientation.
1.3.5 Identify Input PurposeAASupportsBoth 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)AASupportsZero failures across 38 pages in both color schemes.
1.4.4 Resize TextAASupportsNo 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 TextAASupportsThe 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 ReflowAASupportsNo horizontal scrolling at a 320px viewport on any of 38 pages.
1.4.11 Non-text ContrastAASupportsControl 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 SpacingAASupportsNo clipping or scrolling with the 1.4.12 override values applied.
1.4.13 Content on Hover or FocusAANot ApplicableNo 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 WaysAASupportsA 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 LabelsAASupportsHeadings 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 VisibleAASupportsVisible focus indicator confirmed under a real keyboard press.
3.1.2 Language of PartsAASupportsNo 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 NavigationAASupportsThe 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 IdentificationAASupportsComponents 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 SuggestionAASupportsEach 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)AANot ApplicableThe 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 MessagesAASupportsScreen 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.