I see your point on simplicity, but imagine this scenario:

1. `CacheResolver::isStored` calls `ResolverInterface::isStored` (e.g. objectExists for S3)
2. `CacheResolver::isStored` calls `ResolverInterface::isStored` again, as the item is not stored, yet.
3. `CacheResolver::resolve` calls `ResolverInterface::resolve`
4. `CacheResolver::isStored` now has the key and doesn't bother the resolver.

I'm with you, this implementation is fine for now, I will create an issue to take another look into it later on.