venv_sync.prepare_launch and _prepare_borrowed_launch claimed the marker with
UpdateLock() (no install_root), and UpdateLock._claim_marker unlinked a dead
marker without asking whether the checkout lock was held. The claim then
failed acquire_checkout and released its own claim: the killed update's
marker was gone while its completion child still ran, and the Desktop gate
reopened over it.
- _claim_marker refuses as held (pid 0) and keeps the marker when the checkout
lock is held by another process tree (our own hold or an inherited lock fd
may still reclaim).
- UpdateLock(checkout_first=False): install_root names the guarding checkout
without taking its lock first; both venv_sync sites pass install_root=root.
- _lock_holder reports a dead recorded updater over a held lock as held, so
hermes update / launch repair / source completion refusals use the held
wording instead of naming the dead pid (m6).