Depends on Phase 2. Part of #734.
hydracluster hardcodes ALVR when matching a head to a body:
handlers_xr.go:153
if body.District != head.District || body.Status != "online" || !sliceContains(bs.XRDrivers, xrDriverALVR)
and handlers_api.go:978 gates eligibility the same way.
Scope:
Done when: a WiVRn-capable head is matched only to a WiVRn-capable body, an ALVR head only to an ALVR body, and a mixed fleet resolves correctly without hand-pinning.
DONE 2026-09-16, hydracluster v2.0.120 and v2.0.121, verified live.
Two places assumed alvr was the only XR driver, so a wivrn body was invisible however it was configured:
Both default to alvr, so older heads are unchanged.
v2.0.121 followed immediately because v2.0.120 left discovery and claim disagreeing: eligible accepted ANY XR-capable body when no driver was named, while session creation defaulted to alvr. An older head could have discovered a wivrn body and then been refused with not_xr_capable. Both now default to alvr.
VERIFIED LIVE against msi1060:
/api/v1/bodies/eligible?district=bxl1-test&stream_mode=xr&xr_driver=wivrn
-> [{"name":"spicy-cactus-76", ..., "xr_drivers":["wivrn"]}]
Two traps found on the way, now in docs/runbooks/body-selection.md, both of which look exactly like a broken driver: