Skip to Content
Vektos
Anecdotes

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.

On this page