прямо текст? а i18n как же?
Так мы ж говорим о неожиданных ошибках. Для ожидаемых ошибок лучше возвращать константу (цифровую/текстовую), которая в спеке определена.
Хотя мне нравится возвращать константу + текст.
Что-то вроде ["ERR_EMAIL_VALIDATE", "At char is lost"] - т.е. говорим об ошибке валидации email и этот код прописан в спеке, а текстовое описание - для разраба (или даже юзера) с той стороны, ему будет проще понимать причину ошибки валидации.