If probe_success becomes non-zero, even for a single evaluation interval, then the alert will be immediately resolved. There is no delay on resolving, like there is for pending->firing ("for: 5m").
I suggest you enter the alerting expression, e.g. "probe_success == 0", into the PromQL web interface (query browser), and switch to Graph view, and zoom in. If you see any gaps in the graph, then the alert was resolved at that instant.
Conversely, use the query
probe_success{instance="xxx"} != 0
to look at a particular timeseries, as identified by the label9s), and see if there are any dots shown where the label is non-zero.
To make your alerts more robust you may need to use queries with range vectors, e.g. min_over_time(foo[5m]) or max_over_time(foo[5m]) or whatever.
As a general rule though: you should consider carefully whether you want to send *any* notification for resolved alerts. Personally, I have switched to send_resolved = false. There are some good explanations here:
You don't want to build a culture where people ignore alerts because the alert cleared itself - or is expected to clear itself.
You want the alert condition to trigger a *process*, which is an investigation of *why* the alert happened, *what* caused it, whether the underlying cause has been fixed, and whether the alerting rule itself was wrong. When all that has been investigated, manually close the ticket. The fact that the alert has gone below threshold doesn't mean that this work no longer needs to be done.