@JeffryBooher We definitely behave differently if the callback passes an error vs. not.  Check out the `if (err)` block in the bottom of watch() -- without an error, we mark the root as watched, which enables caching when it shouldn't.

I'm not sure what about line 271 would change that... any error codes coming back from the impl are plumbed back via `requestCb` (which was passed to the impl) to the outer `callback` (which was passed to `_enqueueWatchRequest()`).

Re ProjectManager... afaict `_watchProjectRoot()` lets things happily continue if watching fails (project loading actually continues before that result even comes back).  I wonder if you mean the code in `_unwatchProjectRoot()`?  That actually does `reject()` the promise is unwatching fails, but its caller doesn't distinguish since it uses an `always()` handler.  Plus, the changes under discussion here won't cause _un_watch to return an error... just watch.  So if you're seeing a problem with switching projects it might be good to debug it some more to get at the root cause in more detail.