The launcher drops RPC sessions idle >30s (easily hit while the operator sits
in the install dialogs), but a dropped socket still reports Connected until an
I/O fails. InstallProductWorker then skipped its reopen, streamed the archive
on the fresh out-of-band connection, and died on the first progress poll —
and the install-completed handler registered launch entries without checking
e.Error, so AddApp's disconnected-guard exception crashed the whole console.
- PodInfo.EnsureConnectionAlive: probe an "open" connection with a Ping and
reconnect when it is dead; used by the install and uninstall workers.
- SiteManagement.PodInfo_InstallProductCompleted: register launch entries only
on success, and surface registration failures as the row's Install Failed
state instead of an unhandled exception.
- Regression test pins the premise + recovery against vPOD's launcher server
(stale socket reports open, Ping exposes it, reconnect restores service).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>