The idea that supports the watchdog system is good but it is flawed at this point:
The watchdog messages are send asynchronously on ROS topics => they are put in a buffer until the computer scheduler decides when to push them.
This is not a deterministic behaviour and this should not be fixed by using ROS synchronous messages (by specifying a publisher's buffer size of 0) as this is deprecated.
The watchdog system relies on a ROS timer to periodically publish messages, but the timer doesn't have a dedicated thread which mean watchdog messages can be blocked: for instance just using a std::cin in a component to wait for user input. A simple fix would be to use a dedicated std::thread for the timer.
The idea that supports the watchdog system is good but it is flawed at this point: