This comment describes the "hard" part of cache invalidation best: https://news.ycombinator.com/item?id=31674251 - your response to them makes very little sense.
First, you acknowledge that they're correct, though you use obtuse language to say so: you seem to like using the very abstract term "dependency" to represent the very simple concept of detecting updates.
In your second paragraph you then go off on an unrelated tangent by saying:
> Now getting back to the “what’s really hard about cache invalidation” part.
No. You're not "getting back" to that - you're changing the subject back to the topic of your article, which is unrelated to cache invalidation.
> Say you just have a k/v store, no joins, nothing.
Cache invalidation is about invalidation - it's not about your store architecture. It's not about the implementation of logic that processes the clearing/overwrite of values, it's about the when and nothing else.
> just doing TTL, would be simpler.
Yes. It is simpler. If you want to avoid solving the hard problem, you can use a TTL. Now... how long should it be?