How can two reads disagree?
The source changed.
Your copy didn’t.
One source. One saved copy. A small model for a surprisingly common confusion.
First, the source and copy agree.
Copy version A from the source. Both now hold the same value.
The source moves on. The copy stays put.
Changing the source does not update this saved copy. It still holds the last version it received.
A refresh changes the copy. Not the source.
saved copy ← current source value
Read the source.
Replace the saved value.
Both now hold B.
State notation, not executable code. This model assumes the refresh succeeds.
Stale doesn’t mean broken. It means behind.
What the saved copy remembers.
What the source holds now.
Two different versions. One missing refresh.
In this model, A and B are version labels—not clock times or a measure of how old the copy is.
Ask one question: what refreshes this copy?
Keep the model small.
This explanation omits expiry, automatic refresh, failures, concurrency, and multiple cache layers.
A mental model, not a universal caching policy.