(A) Intermittent pure-white startup window. On a Windows VM viewed over
RemoteDesktop the app sometimes opened to a blank white window — no error banner,
not even the static menu bar. A multi-agent investigation + adversarial review
pinned it by one airtight deduction: the BrowserWindow is created with
backgroundColor '#16181c' (dark), so "white" can never be an un-painted, loading,
or failed state — all of those show dark. Pure white, with no banner and no static
menu bar, and silent in the logs, eliminates every DOM/init/CSS/load failure mode
(each would leave the dark styled shell, unstyled black-on-white menu text, or the
red init().catch banner) and leaves exactly one: a GPU/compositor surface failure
on the RDP virtual display adapter. The code ran hardware acceleration full-default
with no fallback (no disableHardwareAcceleration, no GPU switch anywhere), and the
GPU child-process-gone handler is log-only — matching the silent symptom.
Fix (the reviewed safe subset):
- app.disableHardwareAcceleration() at module top (before app.whenReady), gated on
an RDP session (process.env.SESSIONNAME matches /^RDP/) OR a persisted
gpu-disabled.flag in userData. The renderer has no WebGL/canvas/video, so software
compositing costs effectively nothing here and does not undo the recent renderer
perf work; local/console users keep hardware acceleration.
- Auto-heal: when a GPU child-process-gone fires, write gpu-disabled.flag so the next
launch disables acceleration even if the RDP gate didn't match (covers a VM reached
via console or a flaky virtual GPU). Self-heals after at most one white screen.
- The existing child-process-gone / render-process-gone / did-fail-load logging is
kept so the affected server's next white-start log can confirm the cause
(CHILD PROCESS GONE type=GPU). A webContents reload would not disrupt uploads
(uploadManager lives in the main process and is torn down only on quit), but no
watchdog is added because in this GPU mode init completes — an init-complete signal
would not detect the blank surface.
(B) Backup export default filename changed from multi-hoster-backup-YYYY-MM-DD.mhu to
DD-MM-YYYY-multihoster-backup.mhu.
409 tests pass; clean boot (the guard is inert off-RDP).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>