I was under the impression that the behavior of async.auto was that if one of the tasks returned an err, the global callback would be called with this error and all subsequent tasks would not execute. After all, why would they? The global callback has been called so the error has been reported already.
It turns out that only tasks that depend on the faulty task will not run, and the rest will.
I'm not sure if it makes sense for async.auto to report failure by means of a single global callback on one hand, and still run subsequent tasks on the other hand: as far as the client is concerned, the whole thing failed.