8fd1a68106
- heartbeat loop continues past a raising activity callback instead of silently stopping (matches delegate_task / touch_activity_if_due swallow-and-continue semantics) — one transient error must not drop watchdog protection for the rest of a long job - hard 6h elapsed ceiling so a wedged job under HERMES_CRON_TIMEOUT=0 (unlimited child watchdog) cannot mask the gateway watchdog forever - public get_activity_callback() accessor in tools/environments/base.py instead of importing the private _get_activity_callback cross-module - tests: deterministic heartbeat test (event-gated, no timing sleep), no-callback test now asserts the thread is truly never created, new exception-survival guard; dead started event removed - fix comment: delegate_task heartbeat cadence is 30s, not 10s