Description
## Overview
A new Windows render body is available at IP **10.110.15.188** (same subnet as fluffy-dumpling-87 at 10.110.15.197 and cheeky-cactus-86 at 10.110.15.192 — bxl1-test, venue ad6). Needs enrollment and hydrabody installation.
## Prerequisites checklist (from fluffy-dumpling-87 setup)
- [ ] Node enrolled in hydracluster with roles `["hydrabody", "hydravoice", "hydraguard-air"]`
- [ ] WireGuard connected (10.10.100.x range)
- [ ] NVIDIA GPU present and driver installed
- [ ] Sunshine installed at `C:\Sunshine\sunshine.exe` with credentials configured
- [ ] Virtual Display Driver (VDD) installed — verify exactly **one** VDD PnP device enabled (see L1 below)
- [ ] VB-Audio Virtual Cable installed
- [ ] ViGEmBus installed (Sunshine logs Fatal without it)
- [ ] HydraNode + body.yaml installed
## Installation steps
### 1. Enroll and assign roles
```
curl -X PATCH -H "Authorization: Bearer <ADMIN_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"roles": ["hydrabody", "hydravoice", "hydraguard-air"]}' \
https://hydracluster.experiencenet.com/api/v1/nodes/<NODE_ID>
```
### 2. Install hydrabody
```
New-Item -ItemType Directory -Force C:\hydrabody
Invoke-WebRequest -Uri https://releases.experiencenet.com/hydrabody/production/latest/hydrabody_windows_amd64.exe -OutFile C:\hydrabody\hydrabody.exe
C:\hydrabody\hydrabody.exe install
```
### 3. Pre-approve Windows Firewall for experiences
UE experiences show a firewall dialog on first run — pre-approve during provisioning:
```
netsh advfirewall firewall add rule name="Mercator56" dir=in action=allow program="C:\experiences\mercator-talks\Windows\Mercator56.exe" enable=yes
netsh advfirewall firewall add rule name="Mercator56-Shipping" dir=in action=allow program="C:\experiences\mercator-talks\Windows\Mercator56-Win64-Shipping.exe" enable=yes
```
## Key learnings from fluffy-dumpling-87 (apply preventively)
### L1: Duplicate VDD instances break portrait orientation
Symptom: Sunshine captures 3840x1080 virtual desktop despite `vdd_settings.xml count=1`. Root cause: VDD sometimes installs two PnP devices (ROOT\DISPLAY\0002 + ROOT\DISPLAY\0003). With two VDDs, Sunshine spans them as a wide virtual desktop and cannot switch to portrait 1080x1920.
Diagnosis:
```
Get-PnpDevice | Where-Object { $_.FriendlyName -like "*Virtual Display*" } | Select-Object InstanceId, Status
```
Expect exactly ONE Virtual Display Driver with status OK.
Fix if duplicate found:
```
Disable-PnpDevice -InstanceId "ROOT\DISPLAY\0003" -Confirm:$false
Remove-Item "$env:USERPROFILE\.hydrabody\vdd_sunshine_configured.txt" -ErrorAction SilentlyContinue
Stop-Process -Name sunshine -Force
```
After fix: Sunshine log shows `Virtual Desktop: 1920x1080`.
### L2: Stuck stream sessions when Moonlight is force-killed
If Moonlight is killed mid-session, Sunshine does not fire stream/ended. Session stays active indefinitely. Manual fix:
```
curl -X POST http://<body-wg-ip>:47991/api/v1/stream/ended \
-H "Content-Type: application/json" -d {"app":"<experience>"}
```
Tracked in issue #222 for permanent fix.
### L3: Orphan process cleanup — fixed in hydrabody v1.11.40
Orphan scanner previously used app slug as process name prefix (rupelmonde-castle-viewer), never matching the actual UE binary (Rupelmonde). Fixed in v1.11.40 — now reads exe_path from installed experience state.
### L4: Experience library district filter — fixed in hydrabody v1.11.39
Without the query filter, /api/v1/experiences/live returned all districts, causing 404 download spam for experiences not assigned to the local district. Fixed in v1.11.39.
## Reference body
Use **cosmic-pretzel-98** (node-4c2be4b0) as the reference body for this venue. Compare configs after setup using `hydrabody/docs/testbooks/body-readiness.md`.