Symptom: System deadlocks under heavy multi-core load. No individual transaction looks wrong. Progress stops entirely.
Build the concrete wait-for graph: name each transaction/resource held, the resource or message it requests, and the owner expected to release it.
Check protocol credits plus any implementation-specific virtual-channel/buffer pools; do not treat a channel class as one resource.
Look for a snoop that never gets a response (orphaned snoop).
Check home node state machine — is it stuck in a transient state?
Reduce to 2-core litmus test to isolate the dependency cycle.
Debugging individual transactions without seeing the global stall pattern.
Adding buffers to fix deadlock without understanding the cycle.
Skipping litmus tests in favor of random stress only.