ca4a9ec686
The two-witness contract from the first review round still granted destructive authority on ONE silent 1s socket probe: stale heartbeat + armed tick socket + a single miss returned WEDGED immediately, and the #86860 consumers take the bounded SIGTERM/SIGKILL path on that verdict. A short transient synchronous stall (reconnect storm, heavy synchronous callback, scheduler delay) can outlast one recv timeout, so a lone miss is exactly the false-wedge class this change exists to prevent. WEDGED now requires the loop to stay silent across a sustained window: tick_strikes consecutive misses (default 3, tick_gap_s apart). Any answer inside the window proves the loop is dispatching and returns ALIVE; a single miss returns UNKNOWN and keeps the graceful drain path (which also preserves #86684's cron drain floor). A witness that vanishes mid-window is ambiguity, never a wedge. New regression coverage: - unit: single silent probe recovers to ALIVE; sustained silence is required for WEDGED; vanishing witness stays UNKNOWN. - composed (real producer + consumer): heartbeat write stalled while the loop is frozen for longer than one tick timeout but shorter than the wedge window -> probe is ALIVE and launchd_restart drains, never escalates; loop frozen for longer than the window -> WEDGED. The default probe window is ~3.4s worst case, still far inside the 10s subprocess query tier.