Every program has an escalation path on paper. Most of them do nothing, because escalating costs the person raising the flag more than staying quiet costs them. Fix that math and escalation starts working.
The first rule: publish the thresholds before anything goes wrong. If an issue sits overdue for five days, it escalates automatically. Not at someone's discretion. Automatically. When the rule is mechanical, raising it isn't a political act, it's just the process running.
Second, escalation has to reach someone who can actually unblock the thing. Routing a stuck dependency to a manager who also can't move it just adds a layer. Map each escalation type to the person with the authority to clear it, and name them.
Third, close the loop in public. When an escalation gets resolved, the resolution goes back to everyone who saw the flag. That does two things: it shows the path works, and it makes the next person more willing to use it.
At Intuit I tied aging thresholds to named reporting tiers, and overdue items hit a structured escalation with a date and a directly responsible owner. On-time closure went past 96 percent. The framework didn't add pressure. It just made the right thing the default thing.