WORKBENCH PROTOTYPE. FICTIONAL COMPANY. SYNTHETIC DATA.BACK TO THE WORKBENCH

Fictional company (Kestrel Supply Co.). SYNTHETIC data. ILLUSTRATIVE prices. Proof of concept.

Accessibility

This page targets WCAG 2.2 AA, with the limits listed below. It does not claim conformance. Two independent audits have been run on it (see "The independent audit, 2026-10-28" and "The second independent audit, 2026-10-29" below). No screen reader has been used on it, and nobody who uses assistive technology has reviewed it.

Applies to the six pages in site/: index.html (the main page), case-study.html, memo.html, failures.html, accessibility.html (this page, made from this file by a script) and sitemap.html (the site map, which lists every page and what it is for). The table of criteria was written for the main page. The other five are plain pages of text, lists and tables, and what is checked on them is listed under "The other pages". Kestrel Supply Co is fictional and the data is synthetic.

How to read the table

The independent audit, 2026-10-28

On 2026-10-28 the built pages were audited against WCAG 2.2 A and AA. The audit was done by Claude, an AI assistant, in a fresh chat that had not seen the build. It used headless Chromium and axe-core 4.10.2. It was not done by a person. It did not use a screen reader, another browser or a real device, so it says nothing about those.

Of the 55 Level A and AA criteria, the audit found 34 met, 5 not met, 16 not applicable and 0 it could not verify. The five not met were 2.4.3, 1.4.10, 1.4.11, 1.4.12 and 2.4.5. Each is recorded below as not met when it was found. Four were fixed on 2026-10-28 and the fifth, 2.4.5, on 2026-10-29. Each fix began with a check that failed on the page as it stood (the failures are in the technical log).

The independent audit, 2026-10-28, table 1
CriterionWhat the audit foundStatus when foundStatus nowWhat guards it
2.4.3 Focus Order (A)Pressing "Put my guesses back" sent keyboard focus to nothing, and the message did not say what had happened.not metmet, fixed 2026-10-28A browser check presses the button and fails if focus is lost or the message is silent (scripts/checks/interaction.mjs).
1.4.10 Reflow (AA)The decision memo scrolled sideways at 320 px wide.not metmet, fixed 2026-10-28The layout and reflow checks run on every page, not only the main page.
1.4.11 Non-text Contrast (AA)The outline of the unused-week squares in "How a seat is judged" was 1.32:1.not metmet, fixed 2026-10-28A check reads the stylesheet and measures every chart mark in light and dark mode. It also found the shaded break-even band, which had no outline and was 1.06:1 to 1.24:1. That is fixed too.
1.4.12 Text Spacing (AA)Tool names in the "Seats by state" chart were cut off when the four text spacing values were set.not metmet, fixed 2026-10-28The layout check now also runs with a wide font, with and without the spacing values. My earlier check ran in the narrow font of the machine that built the page.
2.4.5 Multiple Ways (AA)The audit marked it not met. WCAG asks for more than one way to find a page in a set of pages, and the pages offer one, the navigation line. The audit's own wording was not available when this was written.not metmet, fixed 2026-10-29A site map lists every page and what it is for, and is linked from the navigation line on every page, from the footer of the main page and from this page. A check lists the .html files in site/ and fails if the site map leaves one out (scripts/checks/sitemap.mjs).

Found in the same audit, lower priority, and not recorded as the failure of a criterion. All four were fixed on 2026-10-28, each after a check that failed first:

2.4.5 Multiple Ways was the auditor's finding, not mine.

The audit marked 3.2.3 Consistent Navigation as met, with a note that the forms of the navigation differ. This project's own list had marked it not applicable, because the notes described one page. One navigation line, the same on every page, was added on 2026-10-28.

Where the audit and this project's own list differ

The audit and this project's own list gave different results on these eight rows. The "before the audit" column is this project's list as it stood in the notes before the audit.

Where the audit and this project's own list differ, table 1
CriterionThe auditThis project's list before the auditThis project's list now
2.4.3 Focus Order (A)not metmetmet, fixed 2026-10-28
1.4.10 Reflow (AA)not metmetmet, fixed 2026-10-28
1.4.11 Non-text Contrast (AA)not metmetmet, fixed 2026-10-28
1.4.12 Text Spacing (AA)not metmetmet, fixed 2026-10-28
2.4.5 Multiple Ways (AA)not metnot applicablemet, fixed 2026-10-29
3.2.3 Consistent Navigation (AA)metnot applicablemet
2.2.2 Pause, Stop, Hide (A)metnot applicablenot applicable
3.1.2 Language of Parts (AA)metnot applicablenot applicable

The audit's result for each of the 55 criteria was given to me as a list, and these eight rows are every difference between it and this project's list before the audit. This project's list still has 2.2.2 and 3.1.2 as not applicable, because nothing starts moving by itself and all the text is English. The audit marked both met. I have not changed either row, and the table shows the difference and does not settle it.

The second independent audit, 2026-10-29

On 2026-10-29 a second audit was done by Claude, an AI assistant, in a fresh chat. It used headless Chromium, axe-core 4.14.0 and Lighthouse 13.6.0. It was not done by a person.

Its scope was index.html only. It did not look at the case study, the decision memo, the failure log, this page or the site map.

Of the 55 Level A and AA criteria, it found 34 met, 0 not met, 20 not applicable and 1 it could not verify. The one it could not verify is 4.1.3 Status Messages, which needs a screen reader.

This is a result for the main page only. It does not say that the whole site has no criterion not met. For the other pages, the first audit and the checks listed under "The other pages" are what there is.

The second audit's totals differ from this project's list by more than 4.1.3. The audit's row-by-row list was not available when this was written, so the other rows are not named here. This project's own list, written for the main page, is in the tally below: 37 met, 0 not met and 18 not applicable. It is not the same list as the second audit's 34, 0, 20 and 1. Nothing in the criteria table was changed because of the second audit, since it found no criterion not met.

Criteria

Criteria, table 1
CriterionLevelStatusHow verifiedWhat was checked
1.1.1 Non-text ContentAmetautomatedEvery chart is an SVG with role="img", a short title as its name and a description attached to it, and sits in a figure with a text alternative and its table. The check tests presence and structure. The wording was not tested with users. The cafe scene follows the same pattern: each counter drawing and each stamp card has a title and a description, and the scene has a table version and a words version. A test checks the stool counts in the page against the seat list.
1.2.1 Audio-only and Video-only (Prerecorded)Anot applicablemanualThe built page has no audio, video, image or frame elements.
1.2.2 Captions (Prerecorded)Anot applicablemanualSame: no media.
1.2.3 Audio Description or Media Alternative (Prerecorded)Anot applicablemanualSame: no media.
1.2.4 Captions (Live)AAnot applicablemanualSame: no media.
1.2.5 Audio Description (Prerecorded)AAnot applicablemanualSame: no media.
1.3.1 Info and RelationshipsAmetautomatedLandmarks, one h1, no skipped heading level, table captions and th scope, fieldset and legend around sliders, a label for every input.
1.3.2 Meaningful SequenceAmetmanualDOM order matches the visual order at wide and narrow widths (two "On this page" lists are switched with display: none so there is one at a time). Tab order walked in the browser pane.
1.3.3 Sensory CharacteristicsAmetmanualSearched the reading prose for words that point by position, shape or colour (left, right, above, below, red, green, round, square). None found. Labels and tables were not searched.
1.3.4 OrientationAAmetmanualNo orientation lock in the CSS or script.
1.3.5 Identify Input PurposeAAnot applicablemanualNo field asks for personal data. The one text field is a seat search.
1.4.1 Use of ColorAmetmanualVerdicts, statuses and chart segments carry a text label, and chart segments also carry a pattern and an outline. In the cafe scene each seat state is a different shape (a person, an outlined person, an empty stool, a covered stool, a coat, a flag, a flag with an arrow, a fogged window, a sticker), and a legend names each one. Looked at in light and dark mode.
1.4.2 Audio ControlAnot applicablemanualThe page plays no sound.
1.4.3 Contrast (Minimum)AAmetautomated + manualThe contrast check covers text and background tokens in light and dark. Computed text colours were also measured in the browser pane.
1.4.4 Resize TextAAmetautomated + manualThe viewport allows zoom (automated). Text at 200% was tested in the browser pane. It found a slider row that overflowed; fixed and logged in the technical log. The layout probe (see 1.4.10) also runs at 640 wide, which stands in for 200% text or zoom because the page breakpoints are in rem. That is an assumption I have not checked in Firefox.
1.4.5 Images of TextAAmetmanualNo raster images. All text is text.
1.4.10 ReflowAAmetautomated + manualNo fixed widths or heights and no hidden overflow (automated). Tested at 320 px wide with every disclosure open: no sideways page scroll. Wide tables sit in labelled regions that scroll with the keyboard, and a check reads every page for that. A layout probe runs the built main page in headless Edge or Chrome at 1920, 1280, 1024, 640 and 320 wide with every disclosure open. It fails on cut-off or shortened text, text outside the window, a sideways page scroll, and a table that scrolls sideways on a wide screen. The case study, memo, failure log and this page have the same probe at 1280, 640 and 320 wide, and a page-width test at 375 and 320 wide. It needs Edge or Chrome installed. The audit found the memo scrolling sideways at 320 px. It was not met until the memo table was put in a scrolling box on 2026-10-28.
1.4.11 Non-text ContrastAAmetautomatedTwo checks, in light and dark mode. One measures a list of token pairs (focus ring, control borders, slider track and thumb, chart outlines, the check mark on a stamp, a full card) at 3:1 or more. The other reads the stylesheet and measures every rule that colours a chart mark: 3:1 for a mark, 4.5:1 for text in a drawing. A mark that is not measured, or not exempted with a written reason, fails. The chart hues that fall short of 3:1 in light mode also have an outline that reaches 3:1, and a pattern. The audit found the unused-week squares at 1.32:1, and the list of pairs had missed them, so the second check was added. It was not met until the squares and the shaded break-even band were fixed on 2026-10-28.
1.4.12 Text SpacingAAmetautomated + manualBody line height is at least 1.5 and nothing has a fixed height (automated). The WCAG text-spacing values were applied in the browser pane and no text was clipped or overlapped. The layout probe also applies the spacing values to the built page at 1280 and 320 wide and fails on cut-off text, including text inside drawings. That probe found four defects my first manual pass missed (see the technical log). The audit found tool names cut off in the "Seats by state" chart. My probe had missed them because it used the narrow font of the machine that built the page, so it now also runs with a wide font. It was not met until that was fixed on 2026-10-28.
1.4.13 Content on Hover or FocusAAmetmanualNo custom hover or focus content in the CSS or script. The only hover rule underlines a link. The browser may show its own tooltip for an SVG title.
2.1.1 KeyboardAmetautomated + manualEvery control is native (link, button, summary, input). Scrolling regions have tabindex="0" (automated). Whole page used with the keyboard in the browser pane.
2.1.2 No Keyboard TrapAmetmanualTabbed through the page in the browser pane. Focus never stuck.
2.1.4 Character Key ShortcutsAnot applicablemanualThe script has no key handlers and the page has no accesskey.
2.2.1 Timing AdjustableAnot applicablemanualNo time limits. The 450 ms delay on the "what has moved" message only holds back an announcement.
2.2.2 Pause, Stop, HideAnot applicablemanualNothing starts moving by itself. The pixel picture starts paused and moves only after Play is pressed (see "The pixel animation" below).
2.3.1 Three Flashes or Below ThresholdAmetmanualNothing flashes. The pixel picture swaps two frames no faster than about 2.5 times a second, in a small low-contrast area, and only after Play (see "The pixel animation" below).
2.4.1 Bypass BlocksAmetautomated + manualTwo skip links come first, both targets exist (automated). They show on focus in the browser pane.
2.4.2 Page TitledAmetautomatedA descriptive title of four or more words.
2.4.3 Focus OrderAmetautomated + manualNo tabindex above 0 (automated). Tab order walked in the browser pane. A browser check presses "Put my guesses back" and fails if focus ends on nothing (automated). The audit found focus lost there. It was not met until the page was fixed on 2026-10-28. Other controls that redraw part of the page have not been tested for lost focus.
2.4.4 Link Purpose (In Context)AmetautomatedEvery link has a name.
2.4.5 Multiple WaysAAmetautomatedThe audit found this not met, because the set of pages offered one way to find another page: the navigation line. WCAG asks for more than one. There are now two. The navigation line is at the top of every page, and the site map lists every page with a line on what it is for. A check lists the .html files in site/ and fails if the site map leaves one out, and fails if the main page footer, this page or the navigation line does not link to the site map. Fixed on 2026-10-29. Whether the site map helps a reader find a page was not tested with readers.
2.4.6 Headings and LabelsAAmetautomatedHeading levels and labels exist and are unique. Whether the wording is descriptive is my judgement.
2.4.7 Focus VisibleAAmetautomated + manualThe stylesheet sets a focus outline of at least 2 px (automated). Seen on links, summaries, sliders and buttons in the browser pane.
2.4.11 Focus Not Obscured (Minimum)AAmetautomated + manualscroll-padding is set (automated). No panel overlaps the main column. Tabbing was watched in the browser pane at 1280 by 800.
2.5.1 Pointer GesturesAmetmanualNo multi-point or path gestures. Every control works with one click or a key.
2.5.2 Pointer CancellationAmetmanualOnly native controls and click handlers. No press-down handlers in the script.
2.5.3 Label in NameAmetautomatedEach control's visible label is its accessible name. Voice control was not tested.
2.5.4 Motion ActuationAnot applicablemanualThe page does not use device motion.
2.5.7 Dragging MovementsAAmetmanualSliders are native range inputs. Each also works with arrow keys, Home, End and a click on the track.
2.5.8 Target Size (Minimum)AAmetautomated + manualMinimum sizes and a slider thumb of at least 24 px are in the CSS (automated). Sizes of links, summaries and sliders measured in the browser pane.
3.1.1 Language of PageAmetautomatedlang="en-AU".
3.1.2 Language of PartsAAnot applicablemanualAll text is English.
3.2.1 On FocusAmetmanualFocus never moves or changes the page. Tabbed through in the browser pane.
3.2.2 On InputAmetmanualA slider updates numbers in place. The data switch redraws the page in place. Neither opens a window or moves focus.
3.2.3 Consistent NavigationAAmetautomatedThe audit marked this met, with a note that the forms of the navigation differ. This project's list had it as not applicable, because the notes described one page. Every page now has one navigation line at the top, with the same links in the same order: the main page, the case study, the decision memo, the failure log, this page and the site map. A check reads every page for it. Added on 2026-10-28.
3.2.4 Consistent IdentificationAAmetmanualRead through the code. Cards for each tool come from one function, so the same parts have the same labels.
3.2.6 Consistent HelpAnot applicablemanualThe page has no help mechanism.
3.3.1 Error IdentificationAnot applicablemanualNothing is submitted and no input can be in error. Sliders keep low at or below base at or below high.
3.3.2 Labels or InstructionsAmetautomatedEvery input has a label, and sliders sit in a fieldset with a legend.
3.3.3 Error SuggestionAAnot applicablemanualSee 3.3.1.
3.3.4 Error Prevention (Legal, Financial, Data)AAnot applicablemanualThe page stores and submits nothing.
3.3.7 Redundant EntryAnot applicablemanualNo multi-step process.
3.3.8 Accessible Authentication (Minimum)AAnot applicablemanualNo sign-in.
4.1.2 Name, Role, ValueAmetautomatedNative controls, names on links, buttons and summaries, and aria-valuetext with the unit on every slider. Whether assistive technology reads these correctly was not tested.
4.1.3 Status MessagesAAmetnot verified"What has moved" is a polite, debounced live region (the markup is checked). After "Put my guesses back" it says so at once, and when the data set is switched it says which data is now showing (a browser check reads both). After a slider move it leads with what was changed and says whether the answers moved (a browser check reads that too). No screen reader has been used to confirm it is announced. The second audit could not verify it either, because it needs a screen reader.

Tally

55 criteria: 31 at level A and 24 at level AA.

There are two lists, and they are not the same list.

The audit's list, as the audit gave it, before any fix: 34 met, 5 not met, 16 not applicable and 0 could not verify.

This project's own list before the audit: 35 met, 0 not met and 20 not applicable.

This project's own list now, counted from the criteria table above:

Tally, table 1
StatusCount
met37
not met0
not applicable18

Of the 37 criteria marked met:

Tally, table 2
How verifiedCount
automated only12
manual only14
automated and manual10
not verified1

So 22 have an automated check and 24 have a manual check. The 18 not-applicable rows were each confirmed by a manual look for the content in question. A check reads the criteria table and fails if these counts do not match it.

The other pages

The case study, the decision memo, the failure log, this page and the site map are plain pages of text, lists and tables. They have no script and no outside file. These are checked by the same automatic checks:

Not checked by a program: the contrast of text on these pages, the order of their headings, and the names of their links. They use dark text on white. They have not been used with a screen reader.

The pixel animation

The café in pixels is a second view of the counter picked above. Rows marked "verified by Chris, Edge on Windows, 2026-10-28" are what he watched in a real Edge window on Windows. His first look on that day showed only the still picture, because Windows animation effects were off and the page correctly followed that setting. He turned animation effects on and then watched the animation. Before that, an earlier version of this section marked rows as verified when he could not yet see it play. That was wrong and is corrected here (see the technical log). Every row not marked as verified is CSS-verified only: to be verified by Chris by hand. An automated check reads the stylesheet and the page, and a browser test sets the animation clock by hand in a headless browser. They are not counted in the tally above, which covers the 55 criteria for the whole page and has not changed.

The pixel animation, table 1
CriterionWhat the page doesHow verified
2.2.2 Pause, Stop, Hide (A)Every animation is paused until the Play button is pressed. The same button pauses it. At most four members walk at once, and they are the only things that move apart from a one pixel rest between two frames.Verified by Chris, Edge on Windows, 2026-10-28: it starts still with a Play button, Play starts it, Pause stops it, and no more than 4 members walk at once. Also CSS and markup (automated) and a headless browser test of start, play, pause.
2.3.1 Three Flashes (A)Frames swap no faster than every 0.4 seconds (the check fails on anything under 0.7 seconds a cycle). The area is small and the greens are close in tone.Verified by Chris, Edge on Windows, 2026-10-28, as far as watching it play shows: nothing flashed and nothing glitched. Also CSS only (automated).
1.4.1 Use of Color (A)Every seat state has its own shape. The four greens carry no meaning on their own.Markup and bitmaps (automated: each state has its own bitmap). To be verified by Chris by hand.
1.4.11 Non-text Contrast (AA)Sprite outlines and marks use the two darker greens on the lightest, checked at 3:1 in light and dark mode. Forced colours turn the picture into system colours.CSS only (automated). Forced colours to be verified by Chris by hand.
1.1.1 Non-text Content (A)Each picture is an SVG with a role, title and description. All words are HTML. The words version is under "Say it in words".Markup only (automated). To be verified by Chris by hand.
2.1.1 Keyboard, 2.5.8 Target Size (A, AA)Play and Pause is a native button at least 2 rem tall.Verified by Chris, Edge on Windows, 2026-10-28: the Play and Pause button worked. Also CSS and markup (automated).
4.1.3 Status Messages (AA)A slider change that moves the marks or the card is added to the existing "what has moved" status region, after a short wait.Markup and script text only (automated). Not verified with a screen reader.
prefers-reduced-motionNothing animates, the Play button is hidden, and a note says why. The still picture is the same as the paused picture.Verified by Chris, Edge on Windows, 2026-10-28: with Windows animation effects off he saw the still picture, no Play button and the explanatory note. Also CSS only (automated), and a browser test with the setting forced on.
Marks over members follow the hours slider, and the card follows the hourly cost (a behaviour of the page, not a WCAG criterion)Moving the hours slider adds or removes the small squares over the members. Moving the hourly cost slider makes the card larger or smaller.Verified by Chris, Edge on Windows, 2026-10-28: both followed the sliders. Also automated tests of the numbers.

Limits

What has not been tested, and what that means:

No criterion in the table above is marked "not met" now. A criterion marked "met" means I found no failure with the checks, the tests and the audits above. That is not the same as none failing.

How the checks are run

The checks run on the whole project, and any one of them failing stops a change. The checks are WCAG 2.2 AA static checks, WCAG 1.4.11 non-text contrast (a list of pairs, and every chart mark), colour contrast, plain English, every id is unique and every link ... exists, the layout and page checks, the interaction probe, and the example and sidebar checks. The manual items need a browser: open the pages in one.