async fn post(url: &str, body: String) -> Result<(), String>Expand description
POST a JSON body, with a deadline.
No retry. A webhook that is down stays down for longer than the evaluation
period, so a retry loop turns one missed page into a queue of stale ones —
and the state machine already re-pages on the next transition. The failure
is logged, and /api/v1/alerts carries it.