isCacheEmpty

True when nothing is cached for any key, in any storage.

Test-only. Prefer this over asserting on states directly so that assertions describe the seeding contract ("the cache was drained") rather than the storage shape, and therefore keep their meaning as the hook side moves out of states.

Reads the two storages under separate lock acquisitions, so the verdict is only meaningful with no resolve in flight -- which is how every caller uses it.