Treat a zombie parent as dead. A signal check still succeeds on it.
concurrency/state
A release, delete or cleanup is written after a call that can throw, or after a newly added early return, or is documented only on the success path, so when that call fails the lock or marker is never released and every later run hits the same held lock and fails the same way.
The job sends an email and then releases its lock; the email call throws, the lock stays held, and every retry of the job finds it locked.
The scope is entered and the release merely comes after the failing call; not setup failing before the scope (Setup Cleanup Gap), not a failing test skipping teardown (Failure Path Fixture Leak), not a deadline abandoning work (Abandoning Deadline), and not a flag left set after its operation by design (Marker Outlives Its Operation).