Gate review: the first /api/ws accept ran the config read + ~350 ms mcp import on the uvicorn
loop; it now goes through asyncio.to_thread (contextvars copied, same profile binding). The
Desktop-serve early return replaces the inverted derived flag, the None-delay holder is
explained once, and the boot test proves "armed, not started" by firing on demand instead
of inspecting the Timer.