Four Codex follow-ups on the Vulkan GPU-selection path:
- /load + /validate: run validate_vulkan_gpu_ids off the event loop
(asyncio.to_thread). It can spawn a blocking Vulkan probe subprocess, which
would otherwise freeze status/progress/unload for up to the probe timeout.
- /api/system, /load, /validate: check the Vulkan build BEFORE the XPU ban. A
Vulkan pick uses ggml ordinals (--device Vulkan<i>), not torch-xpu ordinals,
so an Intel/XPU host on a Vulkan build must still get the picker and accept
gpu_ids instead of being rejected.
- Active/status GPU-kind stamp: an active GGUF hydrated from /status before the
GPU cache warms had no index-space stamp, so a later Reload/Remember treated
its live Vulkan pick as a legacy physical one and reconciled it away. Carry
selectedGpuIdsKind through useActiveModelConfig (via the reactive
useCurrentGpuIndexKind) and fall back to the current kind in
currentRuntimePerModelConfig when the store stamp is missing -- an active pick
is by definition in the current backend's space.