See `lib/tasks/jshint.js` - it uses the return value of the callback as the first argument to the `done()` callback allowing you to return an error from the callback to trigger failing the queue. The behaviour definitely hasn't changed, as I had to split the `6-build-uglify-calendar.js` test into two because it was previously relying on the duck-punched `process.exit` to enable the code to keep going after the process.exit and with the refactor it was failing the test.