Every call to Sunshine's CloseRunningApp endpoint from hydrabody fails with:
HTTP 400: {"error":"Content type not provided","status":false,"status_code":400}
This happens because the HTTP request does not include a Content-Type: application/json header. Sunshine rejects the request, so ForceStop falls back to killing the experience process by name.
/api/v1/body-anomalies and in the body log[stream] ForceStop failed ... falling back to process kill on every clean stream endkilled 2 process(es) for mercator-talks by name), so streams do eventually clean up10:35:17 [stream] hydracluster requested stream termination — calling ForceStop
10:35:17 [stream] TerminateStream ForceStop error: close running app: HTTP 400: {"error":"Content type not provided",...}
10:35:18 [gpu-mismatch] detected: GPU at 98% with stream status idle
10:35:48 [stream] cleanup: mercator-talks (action=kill, reason=grace period expired, pid=0)
10:35:48 [stream] ForceStop failed (close running app: HTTP 400: ...), falling back to process kill
10:35:48 [stream] killed 2 process(es) for mercator-talks by name
10:35:52 [sunshine] stream ended: mercator-talks
The same pattern appears in logs from 2026-05-22 13:26, 15:47, and 21:58 — it is consistent across all stream terminations.
The go-sunshine SDK (or the hydrabody call site) sends the CloseRunningApp POST without a Content-Type: application/json header. Sunshine's API requires it.
Add Content-Type: application/json to the CloseRunningApp HTTP request in go-sunshine (or wherever hydrabody constructs the request). One-line change.
display_device.state and restarts Sunshine (~3 minute window where body cannot accept new streams). This is separate from this bug but compounds the operator experience — the dirty termination alarm fires just before the Sunshine restart window begins.