Hopefully there should be not much trouble such as in 'project-buffers'.
I think there exists a class of commands (existing and potential ones)
that would use default-directory with exact same purpose and
expectations.
Thinking about it, I guess there's (roughly) two classes of commands
which want different things from default-directory, classes 1 and 2:
1. wants whatever the current value of default-directory is (and gets
this by just using default-directory as a variable)
2. wants the value of default-directory for some specific buffer X (and
gets this either with buffer-local-value or by using
with-current-buffer)
If we could change 1 without changing 2, then we'd be happy.
This gets back to my earlier suggestion, that we have some way of
binding a variable which does not change the buffer-local value.
Supporting that would require fairly deep changes in C of course.
(But actually, maybe it would be useful for Lisp threads? In fact,
maybe Lisp threads already support this? Because when you're in a
thread and you bind default-directory, you don't want that to affect any
other threads, you only want it to affect code running directly under
you.)
Anyway, I'm coming around to the idea that actually the "changing the
local value of default-directory" problem isn't that big of a deal. We
can do something special for project-buffers, and that would make things
work OK with the next-default-directory approach, and if we run into
further problems in the future, we'll rethink at that time.