One thing that gets missed in this debate and matters a lot: live validation is far more disruptive for screen reader users than it looks on screen.
If the error message is in a live region, every keystroke that changes validity announces something. The user is trying to hear what they are typing and instead hears repeated interruptions. What reads as a small red hint visually is a constant interruption aurally.
So the on-blur pattern is not only better UX in the general case, it is substantially better for assistive technology. And when you do show the error, associate it with the field programmatically rather than only placing it nearby: otherwise a user who tabs back into the field is told the field is invalid with no indication of why.