It turns out that mutableArrayValueForKey:
does not always return a notifying array. It only does so when observers have already been registered on the observed object!
So swapping my first two lines fixes the problem:
[[DocumentsManager instance] addObserver:self forKeyPath:@"documents" options:NSKeyValueObservingOptionNew context:NULL];
NSMutableArray *docsProxy = [[DocumentsManager instance] mutableArrayValueForKey:@"documents"];
Can't help thinking how much time we'd save if we could read the source code of those methods…