Google indexes a page you tried to block because your block almost certainly controlled crawling rather than indexing, and the gap between those two is where the failure happens. The page slipped in through one of three recurring causes, and each one traces back to the same confusion: stopping a crawl is not the same as stopping an index entry.

The first and most common cause is that you disallowed the URL in robots.txt and assumed that kept it out of search. It does not. A robots block stops Google from fetching the page’s content, but if any other page links to that URL, Google can still list it in the index URL-only, with no snippet, because it learned the address from the link. The block prevented reading, not listing. The second cause is the inverse trap: you did add a noindex tag, but the page is also blocked in robots.txt, so Google is forbidden from crawling it and therefore never fetches the page, never sees the noindex, and never drops it. The directive you relied on was sealed behind the block that defeats it.

The third cause is timing. You added a noindex to a page that was already indexed, but Google has not re-crawled it since, so the old index entry persists until the next crawl picks up the new instruction. The tag is correct; Google simply has not gotten back to confirm it yet. In all three cases the underlying problem is the crawl-versus-index distinction, and the lesson is the same: a robots block does not remove a page from the index, and a noindex only works on a page Google is allowed to crawl and has had the chance to re-fetch.

To actually remove a stubborn page, make sure it is not disallowed in robots.txt, apply noindex so Google can crawl it and read the directive, and then wait for the re-crawl rather than expecting an instant drop. If you need it gone faster, you can request re-crawling, but the order matters: crawlable first, noindex second, patience third.