Wire five new WebSocket frames into hub.go: setCalibration (client→hub), calibration (hub→client broadcast), reloadConfig (client→hub), configSaved and configReloaded (hub→client acks with ok/path/error). Extend hubCmd with cal field, add buildCalibrationMsg and buildConfigAckMsg builders, send calibration on client connect, and run Save/Reload on separate goroutines to avoid blocking the Run() select loop. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>