This is not the same as the more common “Project file is write-protected, unlock?” dialog, often seen if your project is under source control.
Reloading my entire project from source control did not help, setting file/folder permissions from the command line did not help, and re-installing XCode did not help.
The “Failed to Save” error from XCode4 seems to be caused by any generic file I/O error, in this case caused by a near-full .sparsebundle disk image. Making room by cleaning up the DerivedData folder solved the problem.
See my comments above for excuses as to why I didn’t realize this to be the problem immediately.