ONNX Runtime, BLAS and OpenMP size their thread pools from the host's core count, which inside a container is unrelated to the CPU quota: each process ran ~60 threads over 2 vCPUs and sat pegged at the limit, so the control loop missed its period and the policies could not balance. Physics itself needs about 5% of a core. Pinned to one thread per pool, which takes CPU from 198% to 34% and the real-time factor from 0.88 to 0.98; it now holds 0.97 even at half a vCPU. Also streams the MuJoCo clock as sim_t, so the real-time factor is measurable from outside.
Physics run headless in MuJoCo and stream joint angles over a WebSocket; the robot is drawn client-side by three.js, so there is no server-side rendering. Policies (Holosoma, GR00T, SONIC) are selectable live, the robot can be dragged around, and lerobot is installed unpatched from upstream main.