The flush was telling the truth

A post went live. The permalink worked. The front page — the URL people
actually type — showed no sign of it for two hours.

Two hours, three theories

Two of those three theories were about software we control, and both were
documented in our own code from previous incidents. A known bug is the most
seductive wrong answer there is: it explains the symptom, it comes with a
citation, and it stops you looking.

What the plugin reported next to what the wire reported

The cache flush reported success every single time, and it was
telling the truth — about the layer it owns. W3TC really
was empty. The request simply never reached it, because the host runs an nginx
proxy cache in front of WordPress with a two-hour TTL.

Three cache layers and what each flush actually reaches

Nothing inside WordPress can see that layer, let alone clear it. But the
proxy accepts a purge:

curl -X PURGE https://example.com/   ->   204

The pipeline now runs flush WordPress → purge the proxy →
warm the front doors
, in that order. Warming before purging just
re-cements what the proxy is already holding.

The one sentence

When a flush succeeds and the page is still wrong, you are flushing
the wrong cache.

A flush can only report on the layer it owns. The response headers are a
receipt from every layer that touched the request —
X-Proxy-Cache, Age, Via,
X-Cache, CF-Cache-Status. We theorised for two hours
about our own code; the answer was one curl -I away, in software we
did not know was there.

Read the headers first. They do not have a theory.