The help block is linked through aria-describedby, and it is not a live region: it has no role="alert" and no aria-live. A description is read when the field takes focus, so a message that appears while focus is elsewhere is not announced at all.
- The default validateTrigger hides this. Validation on onChange means the error appears while the reader is in the field, so the description is already there when they next move. Switch to onBlur and the message lands on a field they have just left.
- Submit is the case that needs help. Several fields go invalid at once and focus is on the button. Nothing is announced. Either move focus to the first invalid field (below) or put a summary in your own live region.
- Keep the message useful out of context. It is read straight after the label, so "Email: enter a valid address" works and "Invalid" does not.
- help and the error share one slot. A static help node is replaced by the error message when one appears, so hint text written there disappears when the reader needs it most. Put a lasting hint in extra.