naive worker — one catch (OperationCanceledException) around the loop
4 polls, then nothing
call timed out → ExecuteAsync returned
supervised worker — exception filter on the stopping token, restart with backoff
27 polls · back at work ~7 s after its last poll
GET /health
200 Healthy
Every response, for the whole run. A health report only aggregates the checks you registered, and none of them know hosted services exist.
GET /health/workers
503 Unhealthy
naive: ExecuteAsync returned — one check that reads BackgroundService.ExecuteTask, catching it on the next probe, about 4 s into the run.