b74f158b0d
The ghost-prune loop in reconcileUnifiedDesktopHalves used existsSync on the marker's source, which answers false for EACCES/EPERM as well as ENOENT, so a mode-000 / ACL-denied package folder was treated as an uninstall and its materialized half rm -rf'd with no warning. Distinguish a genuinely missing source (ENOENT/ENOTDIR) from one the app is not allowed to stat: keep the half and warn. materializeDesktopHalf now also warns on a non-ENOENT stat failure instead of swallowing it. Part of #111804