The label that pointed nowhere
The first behaviour checks failed a model that had done the right thing: the design system's date picker had no label inside a form field, and axe had never noticed.
Date: 2026-11-10. Context: behaviour checks, graders v3 (journal ch. 68).
What happened
Graders v3 started checking what a page does after the user acts. For the identity form, one
behaviour is: submit with a field left empty, and the field "Date of birth" is marked invalid.
Beam, at ds-mcp-check-full, wrote <FormField label="Date of birth" required error={…}> around
the design system's <DatePicker>. That is exactly what the design system asks for. The check
failed: "no field is labelled Date of birth".
The page in Chrome showed why. The FormField's label pointed at the field's control id; the date
picker's input had an id of its own. Ark's Select and Combobox read the field's context and
take its ids; Ark's DatePicker does not, and our wrapper did not do it for it. So inside a
FormField the date input had no label, was never marked invalid, and was not tied to its error
text. axe passed every run: it accepts a placeholder (mm/dd/yyyy) as a name. The component's own
docs even said the label came from the FormField.
What we learned
- A behaviour check tests the design system too. It asks for a field by its label, the way a screen reader user would. That found what three rounds of axe on every page had not.
- "Uses the design system" is not "accessible". The agent followed the rules, and the rules shipped a gap. Grading agents against a design system is only fair if the design system holds.
- A failure is a question before it is a verdict. The run looked like the agent's mistake. Reading the page took five minutes and moved the fix to where it belonged.
What it means for Vektos
The benchmark's checks are also the design system's tests. Every new kind of check should be run
on the design system's own components inside their usual wrappers (a FormField around each
control) before it grades an agent.
Follow-ups
- Done: the date picker reads the field's context (ids, invalid, required, disabled, read-only,
aria-describedby); a Chrome test fails without the fix. The design system's hash changed. - A story-level check: every control inside a
FormField, found by its label and marked invalid by its error, for each component that claims to work there.
The shortcut only one model took
Given a StockTable that draws the whole stock page in one node, the strong model used it every time. The weak one mostly built the page by hand, or picked the wrong shortcut.
It passed where the repository was
Two bugs that no check could see, because every check ran with the whole repository on disk. Production had only what the build decided to ship.