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 the concurrent workload while preserving the held/requested resource cycle. A two-core litmus may help an ordering failure, but need not reproduce a capacity-dependent deadlock.
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.