Fixed
- 🧟 Zombie process cleanup — process runner
kill()methods now useos.killpg()to signal the entire process group instead of just the direct child PID. Background processes started inside terminals or/executesessions (e.g.sleep 100 &) are now properly terminated on cleanup._cleanup_session()always callsprocess.wait()after force-killing to prevent zombie entries in the process table. - 🐳 Docker PID 1 reaping — added
tinias the container's init process (ENTRYPOINT ["/usr/bin/tini", "--", ...]). Python/uvicorn no longer runs as PID 1, so orphaned grandchild processes are automatically reaped instead of accumulating as zombies.