Highly relevant contents for me in your article!
I would like to add a fourth item to your list: timing. In many cases the user wants to know as soon as possible about an error. However, in some cases this is not the best strategy because different users prefer to enter things or complete actions in a different order, or in some intermediate state things are not complete which may be ok with the user until s/he commits/finishes the operation. For example, I find it very annoying with online shop checkout pages that immediately complain about a missing e-mail address just because you happened to go directly to the next field instead.
A possible fifth addition to the list is the prominence of the error message. Some errors are so cruical that it would be ok to throw up a dialog in the middle of the screen and lock any further action until the user closes the dialog, while most errors are less important and should be signalled a bit more discretely (like for example an incorrect entered e-mail address). This fifth addition may be even more relevant for informational or warning type of messages.
And needless to say, it is best to prevent the errors from happening at all if possible. Recently I was faced with a very annoying message complaining about my e-mail address being invalid, although I copied and pasted it from another window. It turned out that a space was inserted at the end, which I of course couldn’t see, and which could just as well have been removed automatically before validation.