#650 moved tui.data.liveness into runs.py beside engine_liveness; both wrap probe_liveness over one read_pid_identity and differ only in the no-pid arm (legacy-session fallback vs 'dead') and whether ProcessHostError degrades to 'unknown' or propagates — fold them into a single reader with explicit fallback/degrade parameters and rename the shadowing locals in prunable_sessions/request_graceful_stop.
#650 moved tui.data.liveness into runs.py beside engine_liveness; both wrap probe_liveness over one read_pid_identity and differ only in the no-pid arm (legacy-session fallback vs 'dead') and whether ProcessHostError degrades to 'unknown' or propagates — fold them into a single reader with explicit fallback/degrade parameters and rename the shadowing locals in prunable_sessions/request_graceful_stop.