TTL is a maximum, not a schedule.
The common read: The TTL is 300, so five minutes after I change the record every cache re-reads it, and a cutover is an event I can plan a maintenance window around.
DNS never pushes a change to caches. RFC 2181 says a TTL "specifies a maximum time to live, not a mandatory time to live": a cache may hold an answer that long and is never told to re-ask. Each cache's clock starts when that cache fetched, so one that fetched a second before your change may serve the old address for the whole window.
RFC 9499 defines the stub resolver, the recursive resolver and the forwarder separately, and one request from a browser in a container behind a corporate forwarder can pass through all three plus the browser's own cache. Each holds its own copy, and you configure one of them: your authoritative server.
RFC 8767 also lets a recursive resolver answer from expired cache while your authoritative servers are unreachable, so "DNS was fine during the incident" can mean it served data your zone had stopped publishing. When one percent of orders still reach the retired origin twenty minutes after a cutover, this is the cause, not the load balancer. Lower the TTL days ahead, and keep the retired origin serving until its requests stop.

