This is really a big question and there is no 100% solution. I also have been thinking about it many times. The most general solution which will work in any case is:
- The best approach to solve any problem is to solve it before, not after. In this case — presence of clear labels and help texts, whenever possible, help user during input by automatically adding some characters or disabling further input.
- Validating all form on submit because those jumping errors can be sometimes confusing.
- Separate large forms into smaller sections of < 4 inputs, validate each section.
I like your hybrid idea and my 2nd option is — validating input after ~300ms.