Google discards your description and writes its own under a recognizable set of conditions, not at random. The most common one is a query mismatch: when the searcher’s words aren’t in your description but a passage in your body answers them better, Google pulls that passage instead. This is also why the same page can show different snippets for different searches; Google is matching the snippet to the query, not to your tag. So the first trigger is simply that your description didn’t fit the search as well as something already on the page.

The rest of the triggers are about the tag itself. Google generates its own snippet when the description is missing or empty, leaving it nothing to show; when the same description is duplicated across many pages, since it won’t display identical snippets; when the description is generic boilerplate or stuffed with keywords, which it treats as low value; when the description no longer matches the page, often because the content was updated and the tag wasn’t; and when the description is far outside the displayable length, too short to be useful or too long to fit. Any one of these is enough for Google to override you, and on informational and long-tail queries it overrides more often than not.

Treat this as observed behavior rather than a published checklist, since the exact conditions shift, and re-check against current Google documentation when it matters.

Before blaming Google for swapping your snippet, run the weak description through each trigger in turn. Does it actually contain the words people search for. Is it unique to this page. Is it specific rather than boilerplate. Does it still describe what the page now says. Is it within the length that displays. Is the page trying to answer so many different queries that no single description could fit them all. Whichever question turns up a no is the one Google is acting on, and the one to fix.