CI / lint (pull_request) Successful in 56s
docker / lint (pull_request) Successful in 54s
CI / test (pull_request) Successful in 1m2s
CI / publish (pull_request) Has been skipped
docker / test (pull_request) Successful in 57s
docker / docker (pull_request) Successful in 41s
The smoke test probed the server over the network, which fails on the self-hosted runner: the job step runs in a container that shares the host Docker socket but sits on a different network, so it can reach neither a published host port (-p lands on the runner host) nor the server container's bridge IP (different network → curl connect hangs, so the job looked stuck rather than failing). Probe from inside the server container with `docker exec` instead: it goes through the Docker socket and runs in the server's own netns, where 127.0.0.1:8080 always works regardless of runner topology. The image ships python + httpx, so no curl or extra image pull is needed. Drop the now unnecessary -p publish.