The Dependency Dance
Every large project depends on something another team owns. That team has their own priorities, their own deadlines, their own definition of "soon." Learning to navigate that gap — without losing the relationship or the project — is one of the highest-leverage skills in engineering.
What You'll Learn in This Chapter
Dependencies don't kill projects by being hard. They kill projects by being invisible, misunderstood, or left unmanaged until the last three weeks when there's nothing left to do but panic. This chapter gives you a complete system for finding, tracking, and resolving cross-team dependencies before they become critical-path blockers.
- How to build a dependency map before the project starts
- The five types of dependencies and why each needs different handling
- What a Dependency SLA is and how to get teams to honor it
- The early warning signals that a dependency is about to go red
- How to escalate when a team is late without burning the relationship
- The "we'll build it ourselves" decision: a four-question framework
- The seven most common dependency management mistakes
Why Dependencies Are the Silent Project Killers
Here is the most common project failure pattern in large engineering organizations: a project is well-scoped, well-staffed, and well-planned. The team knows exactly what to build. They're moving fast. Then, eight weeks before launch, someone says the words that give every principal engineer a cold feeling in their stomach: "Wait — doesn't this depend on Team X finishing their API first?"
It does. And Team X didn't know they were on your critical path. They've been heads-down on something else. The thing you need from them will take four weeks minimum. You have eight weeks left. You just lost your margin entirely, and the launch is now a coin flip.
This is not a story about incompetence. It happens constantly at Google, Meta, Amazon, and every large company in the world. It happens because dependencies are easy to discover and easy to defer. The team had many things to figure out at the start of the project, and "check with Team X" felt like something you could do next week. Then next week became next month, and the month after that became the discovery that you're in trouble.
"The dependency you don't track is the one that slips your launch date."
The fundamental challenge with dependencies is that they exist at the intersection of two different teams' priorities. Your project is important to you. But to the team you depend on, it's an inbound request among a dozen other inbound requests, competing with their own roadmap commitments. Nobody is being malicious. The system is just structured such that the cost of a slipping dependency is paid by you, not by them.
This asymmetry — where the pain lands on a different team than the team making the decision — is the root cause of most dependency problems. Once you understand that, the solutions become more obvious. Your job is to change the incentive structure, create visibility, and make it easy for the other team to prioritize your needs before things get urgent.
The Anatomy of a Dependency
Before you can manage dependencies, you need to be precise about what you mean by the word. A "dependency" in project execution isn't just "something Team X has to do." That's too vague to act on. A dependency has a specific structure:
The Four Parts of a Dependency
-
1
The Blocker
What specific thing must exist or be completed before your work can proceed. Not "Team X needs to do some API work" — but "Team X needs to ship the v2 user profile endpoint with the `timezone` field included, accessible from our service."
-
2
The Owner
The specific person on that team who is responsible. Not just "the Platform team" — a name. If you can't name a person, you don't have a dependency managed, you have a dependency floating.
-
3
The Date You Need It
Not "soon" or "before launch." A specific date — the latest date at which you can receive the deliverable and still complete your work with reasonable buffer. Work backwards from your launch date to find this.
-
4
The Consequences of Slipping
What happens to your project if this date is missed. One day late? A week? The launch is delayed? A team needs to idle? The other team needs to understand the blast radius of their slip.
Notice how different "we depend on the Platform team for some API stuff" is from: "We need the Platform team's user profile API v2 with the timezone field, delivered by October 3rd. If it slips past October 10th, we cannot launch before the November freeze." The second version is actionable. The first version is just background anxiety.
The Five Types of Dependencies
Not all dependencies are the same, and treating them the same will cause you to over-manage some and catastrophically under-manage others. Here are the five types you'll encounter on a large project, and what makes each one different:
| Type | What It Means | The Risk | How to Handle It |
|---|---|---|---|
| Hard Technical | You cannot build or test your component until theirs exists. A missing API, missing infra, missing data. | Work comes to a hard stop. No workaround. | Identify earliest. Escalate soonest. Consider mocking in parallel. |
| Soft Technical | You can build without it, but integration or performance testing requires it. | Hidden quality risk. Works in dev, breaks in prod. | Build with a mock or stub. Schedule integration sprint early. |
| Review / Approval | A legal review, security review, privacy review, or design review that must complete before you ship. | Approval processes have unknown and variable timelines. | Start these absurdly early. Never wait until you're "done" to start a review. |
| Coordination | Another team needs to make a matching change at the same time as you — a flag flip, a config update, a data migration. | Your launch requires a synchronized action you don't control. | Write a launch runbook. Run a dry-run. Confirm owner and on-call window early. |
| Knowledge | You need expertise from someone on another team — an explanation of a system, a design review, their historical context on a decision. | Easy to forget it's a dependency at all. Gets discovered late. | Schedule explicitly. Don't assume it'll "just happen in a meeting." |
The most dangerous type is not the hardest one — it's the Review/Approval dependency. Engineers systematically underestimate how long review processes take. A security review that you think will take a week can take a month if the security team is backed up, if they find issues, or if the review uncovers work that needs to be redone. Legal and privacy reviews are even less predictable. The engineering culture of "ship it then we'll do the review" has delayed more launches than any technical problem.
Starting Reviews at Code Complete
Most teams start security reviews, privacy reviews, and legal reviews only after the code is written. This is a structural mistake. These reviews exist precisely to catch things that require design changes — changes that are cheap when you're in planning and expensive when you're done. Start reviews at the design doc stage. If the review takes a month, you have a month. If it requires rework, you have time to do it. If you wait until code complete, a one-month review plus two weeks of rework becomes a six-week project slip.
Mapping Before You're Stuck
The right time to map your dependencies is before you start building. Not at kickoff. Not after the first milestone. Before. The reason is simple: a dependency you discover at the start of the project has three, six, or nine months of runway to be resolved. A dependency you discover at week ten has three weeks.
Dependency mapping is an exercise you do with your team and your key technical leads. You take your project plan — the milestones, the components, the launch requirements — and for every single piece, you ask: "What has to be true for this to work, that we don't own?" Write everything down. Then for each item, you find the owner.
The Dependency Graph
A dependency graph is a visual representation of what your project needs and where it comes from. You don't need fancy tooling. A whiteboard or a shared doc with a simple table works fine. What matters is that it's visible, updated, and reviewed regularly.
The columns you need in your dependency tracker are simple. Aim for the following:
Dependency Tracker: Core Fields
-
1
What We Need
One sentence. Specific. If a new engineer read this without context, they'd know exactly what to ask for.
-
2
Which Team / Who Owns It
Team name and the specific point-of-contact on that team. Both matter. "Platform team" is not an owner. "Platform team / Priya S." is.
-
3
Date Needed By
Your internal need-by date — not their expected delivery date. These two numbers should be compared explicitly.
-
4
Their Committed Date
The date they've explicitly agreed to. If you don't have an explicit commitment, write "None — need to get this." That field being empty is a risk that needs action.
-
5
Status
Green (on track), Yellow (at risk — date commitment uncertain or timeline is tight), Red (slipping — our date is in jeopardy). Update this every week.
-
6
Mitigation / If This Fails
What's the plan B? Can we mock it? Can we launch without it? Can we do it ourselves? Having an answer here prevents panic later.
Finding the Critical Path
Once you have your dependency tracker, the next step is to find the critical path. The critical path is the sequence of work where a one-day slip equals a one-day slip to launch. Everything off the critical path has some float — it can slip a bit without affecting the launch date. Everything on the critical path has zero float.
The critical path is almost never the longest list of tasks. It's the narrowest chain. Take your timeline, find the sequence of work where every step feeds the next with no slack, and that's your critical path. Every dependency on the critical path deserves your personal attention every week. Every dependency off the critical path can be monitored but doesn't need the same intensity.
The Critical Path Changes
Many engineers find the critical path at the start of the project and never revisit it. This is a mistake. As work gets done, as dependencies resolve, and as scope changes, the critical path shifts. Something that had a month of float in week one might have zero float in week eight if another task slipped. Review your critical path at least monthly, more often in the last quarter of the project.
The Dependency SLA: Getting Commitment Before You Need It
Here is the hardest truth about cross-team dependencies: a team that hasn't committed to a date hasn't committed to a date. "Yeah we should be able to get that to you" is not a commitment. "We'll try to do it in Q3" is not a commitment. An SLA — a Service Level Agreement — is a mutual, explicit commitment about what will be delivered, when, and what happens if it slips.
Most engineers hate the phrase "Dependency SLA" because it sounds like bureaucratic overhead. Here's a simpler way to think about it: it's a short written confirmation that you and the other team have the same understanding of what they're delivering and when. That's it. You write it, they read it, they say yes. The whole thing takes ten minutes and it has saved entire quarters of work from blowing up.
What Goes Into a Dependency SLA
A Dependency SLA is not a legal document and it doesn't need to look like one. It's usually a few bullets in a shared doc or a structured Slack message that you send, they confirm, and you both have a record of. Here's the structure:
A Real Dependency SLA (the whole thing)
To: Priya S. (Platform Team)
From: Marcus T. (Search Ranking Team)
Re: User Profile API v2 for Project Nighthawk
Hey Priya — confirming our dependency on the Platform team for Project Nighthawk. Here's what we understand:
What we need: The v2 user profile API, specifically the timezone and locale fields, accessible from the search-ranking service with p99 < 20ms at our expected read volume (approx 50k rps at peak). Needs to handle read traffic from the search-ranking service without rate limiting.
When we need it: We need a staging-environment version by October 3rd for integration testing, and production-ready by October 24th. If we don't have the production version by November 1st, our launch window closes until January.
What we'll do if it slips: We'll mock the timezone field in staging and proceed with integration testing, but we cannot ship without the production version.
What we're asking from you: (1) Confirm you can hit these dates, (2) flag us immediately — not at the deadline — if anything changes, (3) let us know who's the best point of contact for integration questions as we build.
Can you confirm this matches your understanding? Happy to jump on a call if anything is unclear.
This message takes five minutes to write and it does several important things at once. It forces precision — writing it down exposes vagueness. It creates a paper trail. It tells the other team that this is real, named, and tracked — not just a casual ask. It makes the consequences of slipping concrete. And it asks for explicit confirmation, which means silence is no longer ambiguous.
The most important line is: "flag us immediately — not at the deadline — if anything changes." This is the part most teams skip. And it's the part that causes disasters. When a team knows a dependency is at risk, they often wait until the deadline to tell you. They're hoping the situation will improve. They don't want to create alarm prematurely. They're busy. But from your perspective, finding out on October 24th that the API won't be ready is a crisis. Finding out on October 3rd that they're running two weeks behind is a problem you can work around. You need them to tell you early, and you need to explicitly ask for it.
You Are Not Being Pushy. You Are Being Clear.
Engineers often feel uncomfortable sending a message like the one above. It feels demanding. It feels like you're not trusting the other team. The opposite is true. When you don't communicate explicitly, the other team has to guess at your priorities, your timeline, and the consequences of their decisions. Explicit communication is respectful — it removes the guesswork and lets both teams make good decisions. A message that says "here's what I need and when and why" is a gift to the person receiving it.
When a Dependency Is Late
You did everything right. You mapped your dependencies early. You got explicit commitments. You sent weekly check-ins. And now it's three weeks before the date, and the other team is behind. This happens. The question is what you do next.
Early Warning Signals
Before a dependency is officially late, it shows signs of stress. The sooner you see these signals, the more options you have:
| Signal | What It Means | What To Do |
|---|---|---|
| Your point of contact stops responding quickly | They're underwater or avoiding a difficult conversation | Reach out directly, warmly, with low-pressure framing: "Just checking in early — is everything on track?" |
| Their team had a resourcing change (someone left, moved off the project) | The commitment was made by someone who is no longer there | Immediately reconnect to understand if the new owner knows about the commitment and can honor it |
| They started asking you questions they should already know the answers to | Work on this item hasn't started yet, or was started by someone without context | Offer to do a joint sync. Bring clarity. Reduce friction to make it easier for them to move fast. |
| Their team's roadmap changed publicly (org announcement, priority shift, incident) | New priorities may have displaced your work | Proactively reach out. Don't wait for them to tell you — they probably have six things on fire. |
| Their estimate for the remaining work is larger than what's left in the timeline | They are not going to make the date as currently planned | Move to a mitigation conversation immediately. Don't hope it'll compress. |
The common theme here is: do not wait for the other team to come to you. Your job is to have enough visibility into their progress that you see the problem before they've decided how to tell you about it. This requires a relationship — not surveillance. If you've built a good working relationship with your point of contact, they'll often tell you early and voluntarily. If the relationship is purely transactional, you won't hear about problems until they've become crises.
Escalating Without Burning the Bridge
Escalation is the word that makes everyone uncomfortable. It sounds aggressive. It implies you're going over someone's head, creating drama, making enemies. When done poorly, that's exactly what it does. When done well, it is simply the act of getting more senior people involved so that a decision can be made at the right level.
The fundamental rule of escalation: escalate the situation, not the person. There is a world of difference between "Team X is failing and their lead isn't responding" and "We have a project risk I want to make visible: we're dependent on Team X for X by Y date, and current signals suggest we may miss it. I'd like to get both teams' managers to align on how to handle it." The first destroys a relationship. The second solves a problem.
How to Escalate a Late Dependency (In Order)
-
1
Peer-to-peer: direct conversation
Talk to your counterpart directly. Be explicit about the risk. Ask: "Is there anything blocking you that I can help remove? Do you need anything from me?" Most dependencies get unstuck here. It costs five minutes and preserves the relationship entirely.
-
2
Joint working session
If the problem is complexity or unclear requirements, get in a room together. Pair on the problem. Your presence, your clarity, and your help often unblock more than any amount of expectation-setting.
-
3
Loop in your manager (not theirs)
Tell your own manager: "We have a dependency risk on Team X. Here's the situation. I want you to know in case this needs to become a manager-to-manager conversation." This is information-sharing, not escalation. It also means your manager is not surprised later.
-
4
Formal manager-to-manager discussion
Both managers talk to align on priorities. This is a legitimate escalation and it's appropriate when a business decision needs to be made at a level where both teams have equal standing. Frame it as a resource/priority decision, not a blame conversation.
-
5
Shared leadership visibility
If the project is high enough stakes that a launch slip would be visible to a VP or director, make sure leadership is aware — in your own updates, not as a complaint. "We have a risk: Team X dependency may slip our launch to Q1. We're actively working the options." Leadership can often unlock resources faster than anyone else in the chain.
The key discipline: move through these steps deliberately and in order. Jumping straight to step four when step one hasn't happened is not escalation, it's ambush. The other team's manager finds out they have a problem at the same time they find out you've complained to your manager about it. That is a relationship-damaging move that you will feel for years. Go in order.
The Escalation That Worked
A search infrastructure team at a large tech company was blocked on a partner team for a critical indexing pipeline change. They had a hard commitment for July 15th. By July 1st, it was clear the partner team was underwater — two engineers had transferred off, and the work hadn't started.
The project lead didn't send a Slack message calling out the partner team. She called her counterpart and said: "I know you're stretched thin. The pipeline change is on our critical path and I'm starting to worry. Can I send one of my engineers to pair with your team for the next two weeks to get this done? I'll handle the coordination cost — I just need the work to happen." The partner team lead was visibly relieved. They said yes. The change shipped July 12th. No managers needed. No drama. Just a creative offer that aligned everyone's interests.
The "We'll Do It Ourselves" Decision
At some point in almost every complex project, someone on your team will say: "If Team X can't get us what we need, let's just build it ourselves." Sometimes this is the right call. Often it is not. It is never a decision to make in frustration.
Building it yourself solves the dependency problem by eliminating the dependency. But it creates a different problem: you now own something you weren't planning to build, maintain, operate, and support. The team that was supposed to build it has domain expertise you don't have. Their solution would have benefited from their years of context. Your solution will be built in weeks under pressure with none of that context. It will have bugs. It will have edge cases they would have known about. It will require on-call ownership in perpetuity.
None of this means you should never build it yourself. Sometimes the dependency is on a genuinely low-priority item for the other team. Sometimes the scope is small enough that the risk is manageable. Sometimes waiting is more expensive than building. But you need to evaluate this honestly, not emotionally.
The Four Questions
Should We Build It Ourselves?
-
1
What is the real cost of waiting?
Quantify it. Not "we'd be delayed" but "we'd slip the launch by six weeks, which means we miss the Q3 deadline, which has the following business consequences." If you can't make the cost concrete, you may be reacting emotionally rather than analytically. The cost of waiting is sometimes zero — you can parallelize other work and pick up the dependency later.
-
2
What is the real cost of building it?
Not just the engineering time to build it, but: the time to test it, the time to make it production-safe, the ongoing maintenance burden, the on-call burden, and the opportunity cost of the engineers who'd be working on this instead of their primary work. Total it up honestly.
-
3
Are there third options?
Most dependency problems have more than two options. Could you scope down what you need to something the other team can deliver faster? Could you get one engineer embedded in their team to accelerate the work? Could you ship a degraded version of your feature that doesn't require the dependency? Explore the space before committing to "build it ourselves."
-
4
If we build it, what happens to the relationship and the long term?
When you duplicate another team's platform, you send a message: "We don't trust you to deliver for us." That message echoes. Future projects where you need that team will start from a place of tension. If this is the right decision, make it with eyes open and communicate with the other team respectfully — not as a punishment, but as a business decision under time pressure.
Building a Shadow Copy in Frustration
The worst version of "we'll do it ourselves" is when a team, frustrated with a slow dependency, quietly starts building their own version without telling the other team. Now two teams are building the same thing. The org has duplicate ownership, duplicate maintenance, and often two slightly-incompatible systems that need to be reconciled later. One large company spent 18 months reconciling three separate authentication libraries that had been independently built by three teams who each got frustrated waiting for the central auth team. The cost of the reconciliation was larger than the original dependency delay would have been.
If you decide to build it yourself, tell the other team. Be respectful and direct: "We've decided to build this ourselves given our timeline. We wanted you to know so there's no duplication of effort and we can coordinate on interfaces." This keeps the relationship intact and prevents shadow proliferation.
Buffer Teams and Coordination Debt
There is a pattern in large organizations called the "buffer team" — a team that exists between you and the team you actually need, whose primary job is to coordinate the coordination. You submit a request to the buffer team. They submit a request to the platform team. The platform team submits the change. Three weeks later, something ships. Nobody is sure exactly what happened.
Buffer teams are a symptom of an organizational problem: the real owners are too busy, too specialized, or too siloed to interact directly with every team that needs them. The buffer team exists to reduce their communication overhead. This is understandable. It is also, from a project execution standpoint, extremely dangerous.
Buffer teams introduce distance. Distance introduces lag. Lag introduces misunderstanding. By the time your requirement has passed through a buffer team to the real owner, the nuance of what you actually needed may have been lost. By the time the response comes back, the context has shifted. Requirements that needed clarification didn't get clarified; they got approximated.
When you're working through a buffer team, you need to do one thing: find the actual owner. Not to bypass the buffer team's process, but to supplement it. "I work through your PM for requests, but is there a technical lead I can speak with directly to make sure we get the requirements exactly right?" Most engineers on the other side of a buffer team are delighted to have a direct conversation with the person who actually knows what they need. The buffer team can keep their process; you just want to also have direct technical communication.
Coordination debt is the accumulation of unresolved ambiguity across multiple teams. Each handoff that happens without full context being transferred adds a small amount of debt. Each assumption that gets made instead of confirmed adds debt. Each week that passes without a dependency status check adds debt. Like financial debt, coordination debt compounds: small misalignments become larger misalignments, which become integration failures in the final sprint.
The only way to pay down coordination debt is through direct, explicit communication — regularly, not just at crisis moments. Weekly dependency check-ins, brief but consistent, are worth far more than a monthly escalation when things go wrong.
The Seven Most Common Dependency Management Mistakes
After watching dozens of projects navigate dependency problems, the same mistakes appear over and over. None of them are mysterious. All of them are avoidable.
Seven Mistakes That Kill Projects via Dependencies
-
1
Discovering dependencies too late
The single most common mistake. A dependency discovered in week ten of a twelve-week project has no good options. Do the mapping in week one.
-
2
Verbal commitments only
"They said they'd do it" is not an SLA. Conversations decay — people forget what was said, their understanding diverges from yours, and when it slips there's no record of what was actually promised. Write it down. Both parties confirm in writing.
-
3
Tracking status without tracking risk
A status of "Green" is only useful if you know what would make it Yellow. Many teams track whether the work is on track today but don't model the scenarios that could make it not on track tomorrow. Ask: "What would have to go wrong for this to slip?" before it goes wrong.
-
4
Treating all dependencies as equally urgent
The dependency that's on the critical path with no mitigation is a P0. The dependency that's off the critical path with a reasonable mock in place is a P2. Managing them the same way means you'll waste attention on the wrong things and miss the real risk.
-
5
Waiting for them to come to you
This is the passive trap. "If they had a problem, they'd tell me." They often won't — because they're hoping it'll get better, because they don't want to create alarm, because they don't realize you're blocked. Check in proactively, briefly, and consistently.
-
6
Making the dependency conversation transactional
If every interaction with another team is "do you have the thing yet," you will become the person nobody wants to work with. Build a genuine relationship. Understand their challenges. Help them when you can. The team that sees you as a partner will prioritize your work. The team that sees you as a demanding requester will not.
-
7
Escalating at the last minute
Escalating at the end, when there are no good options left, forces a rushed decision with high stakes. Escalating at the beginning, when you first see signals of risk, creates space for options. The sooner you make a problem visible, the more flexibility the organization has to solve it.
Putting It All Together: The Dependency Review
The practical system that brings all of this together is the weekly dependency review — a ten-minute standing check-in that happens every week for the life of the project. It is not a status meeting. It is not a blame session. It is ten minutes where you and your tech lead go through every open dependency on the tracker and ask three questions:
Is it still on track? A quick confirmation from the owner. If the answer requires a long explanation, that's a signal.
Has anything changed that could affect it? Org changes, priority shifts, resourcing moves. This surfaces early warning signals before they become late warnings.
Does the status need to change? Green, Yellow, or Red. If it was Green last week and something changed, update it. The status is only useful if it's accurate.
This ten-minute ritual, done consistently, is worth more than any dependency tracking system, any project management tool, or any escalation process. The dependencies that kill projects are always the ones that looked fine until they suddenly weren't. The weekly review is the mechanism that finds the "it's fine" dependencies that are quietly about to become "it's not fine" dependencies.
The Dependency Review Template
Send this to your point of contact for each critical dependency, once per week. Keep it short. The easier you make it to respond, the more likely they are to respond honestly and quickly.
"Hey [Name] — quick weekly check-in on [dependency]. Still on track for [date]? Anything I should know about? Any way I can help unblock?"
Three sentences. Takes 90 seconds to send. Surfaces problems weeks before they become crises. The tone matters: warm, helpful, not demanding. You are checking in with a colleague, not auditing a vendor.
Key Takeaways
-
1
A dependency without an explicit written commitment is a wish, not a plan. Get it in writing. Both parties confirm. Keep the record.
-
2
The right time to map dependencies is before you start building. A dependency found in week one has months of runway to resolve. Found in week ten, it has only bad options.
-
3
Escalate the situation, never the person. Frame escalations as resource decisions the organization needs to make — not as evidence that someone failed.
-
4
The "we'll build it ourselves" decision is sometimes right. But make it analytically, not emotionally. Count the full cost: build time, maintenance, on-call, and relationship damage.
-
5
A weekly ten-minute dependency review, done consistently every week, is worth more than any project management tool. Most project disasters are visible six weeks before they land — if you're looking.
-
6
The teams that prioritize your work are the teams that see you as a partner, not a requester. Invest in the relationship before you need the dependency.
-
7
Review/Approval dependencies (legal, security, privacy) have the most unpredictable timelines. Start them absurdly early — at the design phase, not at code complete.