What if we specify as an open standard (in protocol) a client proxy service, such that nothing about it ever ties a client to a particular one. All they do is offload the fetching work. If you suspect they aren't serving you correctly you point your client to a different one. As long as there is no friction involved in switching away from a proxy that is censoring, I don't think there would be a drive for them to aggregate into a single service. You wouldn't be switching apps, you'd be pointing your app elsewhere.
Discussion
I'm not suggesting aggregating everything, just doing the fetching on behalf of the clients and using the local cache to assist if possible.
Also of course the caching proxy would be doing the outbox model.
the caching services already have kinds so you can consider them specs, but then every app wanting to have an edge will keep creating more RPC methods to satisfy their UI, it is impossible to make a spec for this that has any chance of ossification.
search is impossible to decentralize, and that is what all popular Nostr apps will become, frontend to search engines.
switching apps is the best we can ever do and that is great, because we don't even have that now with current social media.
if you ignore social media and focus on usecases that are much less expensive to crawl on your own at edge devices, things get much brighter, so I think people should focus on small worlds if they need the absolute most censorship resistance.
good thing is, small worlds are better anyways.
I've thought about something similar, but not just for data fetching, it would be like some custom servers that would massage the data for you and just serve you a feed, in a very centralizing manner, but then what are the incentives for someone to do that for free without being evil and at the same time deviating from the protocol and implementing new things so users can't switch easily? Maybe it will work, but it's probably a slippery slope.