ExecuteAsync returned.

Nothing logged it. /health still says Healthy.

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
restart ×2, with backoff
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.
ExecuteAsync throwsStopHost by default — and exit code 0
ExecuteAsync returnsno log at all, host runs on
new in .NET 10even a throw before the first await is quiet
gdhami.net