You're right that this is not consistent. It looks to me like this is typically some kind of error object when passed in from Node.

The array of array of strings format was good for validation, but these exceptional cases seem different. We can't even predict all of the exceptional cases, I think.

Of course, they're presented differently so they don't need to be the same. callback(null, result) has result.errors which means "the data presented wasn't perfect, but I had no trouble reading it". callback(err) means "there was an exception and I had to stop processing".

I think the fix here is better documentation.