Stale content needs a readable freshness mark; it is not the same as latest
Aliases: as-of timestamp · not latest · stale badge
What it is
If the frame a cache paints is indistinguishable from a frame just arrived from the server, people will take old propositions as now-propositions. A freshness mark writes “when is this from” into the UI: relative time, absolute time, or a sentence “may not be latest”. Stale is not secretly using old data. It is using old data in public. Without a mark, the milliseconds acceleration bought are a silent false-latest.
Why it happens
People have a default for unmarked statements on a screen: this is the current world. News headlines, stock counts, unread badges all enter decisions under that default. Cache breaks the default’s generating condition (not confirmed by this network trip) and often does not break the default’s appearance. The mark’s job is to change appearance so the default becomes “this is the world as of some moment”. The moment must be readable: a vague grey dot, an icon only developers know, equals no mark. Readable is not the same as alarming — “2 minutes ago” and “data may be expired” have different grain. The first lets people calibrate whether it still counts as now; the second only creates anxiety.
The mark also has to travel with the content, not live only on a distant settings page. What people are looking at is this stock line, this mail; freshness should sit beside that line. One page-level badge mixes blocks already refreshed with blocks still old into a single age, and the mark itself becomes dishonest.
Where it stops holding
Static objects that will not change after publish do not need a freshness mark; it is noise. Marks belong on things that change and that people might treat as now. Offline, “last synced at” is both freshness and offline state and may be one mark — that is not a reason to omit a mark when online yet serving cache. Relative time itself goes stale (“just now” sitting on screen for ten minutes); the mark needs to refresh or switch to absolute time, or the mark is stale too. Safety-critical data must not fall to “mark it and then treat it as now” — that is the fourth leaf. A mark will not save data that must not default to stale.
Applying it
- For numbers and states painted from cache that people might treat as now, put a readable moment or “latest not confirmed” next to them.
- Blocks that refresh successfully drop the mark or take a new moment; still-old blocks keep theirs. Do not share one outdated badge across the page.
- When relative time crosses a band, update the display so “just now” cannot freeze.
- How to check: open stock or unread from a clearly expired cache. If the UI looks like an ordinary “now” page, freshness was not marked. After marking, ask whether someone can point to when this copy is from — if they cannot, the mark is not readable.
Related
- Same group: I2.12.1 Cache speeds presentation but risks disagreeing with the server · I2.12.3 Silent refresh in the background, with a change hint, beats forcing a wait · I2.12.4 Safety- or time-critical data must not default to a stale cache
- Nearby: I4.07 Freshness levels and consistency expectations · I4.04 Time display format · I3.03 Offline state
- Search terms:
freshness marker·stale indicator·as-of timestamp