At a glance
Launch-ready release was blocked by cross-team dependency failures 24 hours before go-live.
- Mapped the dependency chain and prioritized blockers by business impact
- Split release into stable core + deferred non-critical features
- Facilitated a war-room with QA, DevOps, and product for rapid validation
Core release shipped on time with zero rollback and smooth follow-up patch.
The situation
The release was launch-ready. Code complete, tested, and scheduled, and then, 24 hours before go-live, dependencies owned by other teams failed. That is a specific kind of blocked: nothing in my team's scope was broken, and nothing in my team's scope could fix it. [NEEDS INPUT: which teams owned the failed dependencies and what the dependency actually was — service, data, or approval] The go-live date was fixed and the release was built to meet it. [NEEDS INPUT: who the go-live date had been committed to outside the delivery team, and what depended on it holding] The people who could unblock it did not report to me.
How it surfaced
Cross-team dependency failures rarely announce themselves as a release blocker. They surface as a validation step that will not pass, or an environment that will not come up, and the first read is always that it is a local problem. What made it real was the ownership boundary: every path to a fix ran through a team with its own backlog and its own priorities. A blocker you cannot resolve inside your own escalation path is a schedule risk, not an engineering task.
What I ruled out, and why
I mapped the dependency chain before deciding anything, because the release is blocked is almost always an overstatement. What I needed was the difference between features genuinely coupled to a failing dependency and features that merely shared a release train with them. Then I ranked what remained by business impact rather than technical severity, because the two produce different orders and only one of them tells you what can ship.
Slipping the date was the obvious move and I ruled it out: with 24 hours left, a slip buys time only if you know when the dependency will be fixed, and that timeline sat inside another team's backlog, not mine. Trading a certain cost for an unknown wait is not risk management. I also ruled out escalating to force overnight prioritization from the other teams. Even if it worked, it would make go-live depend on work I could not observe or validate, and an emergency change in a system my team does not own is the risk I was trying to avoid.
The decision and what it cost
I split the release: a stable core that had no dependency on the failing chain would ship on the date, and everything coupled to it would be deferred to a follow-up patch. That decision cost real work. Features that were finished and tested did not go out on launch day, and deferred code is not free. It has to be rebased, revalidated and released again, which is a second cycle nobody budgeted. I also accepted the harder conversation: telling stakeholders who were expecting a full launch that they were getting part of one. I chose a partial release I could guarantee over a complete release I could only hope for.
What I did
The dependency map came first and it did the work of the decision. Once the chain was on one page, the split between shippable and deferred was mostly read off it rather than argued about. I then ran a war-room with QA, DevOps and product in one session rather than in sequence, because a 24-hour window cannot absorb handoffs. Product confirmed which deferrals were acceptable and QA validated against the reduced scope that was actually going out, not the scope that had been planned, with DevOps in the same session rather than downstream of it. Every blocker was ranked by business impact, and anything below the line was deferred without further debate.
The outcome
The core release shipped on time with zero rollback, and the follow-up patch landed smoothly afterwards. Zero rollback is the number I care about most here: it means the reduced scope was validated as what actually shipped, not as what we had planned to ship. A release that goes out on date and comes straight back is worse than a slip. [NEEDS INPUT: how long after go-live the follow-up patch shipped, and what it contained]
What stayed changed
I treat a cross-team dependency as a named risk with an owner on the other side and a check date before the freeze, rather than something discovered at validation. I want a documented core in the release plan — the subset that can ship if any external dependency fails — decided while there is no pressure on the call. And QA, DevOps and product in one session rather than in sequence is how I run a release-day escalation.
Related incidents
Managing Scope Creep with Clients: Three Weeks of Requests in the Final Delivery Week
A client asked for three weeks of new features during the final delivery week. I documented the agreed scope against the requests with the delivery cost of each item attached, shipped the contracted work on date, and moved the rest into a phased plan — the relationship held and Phase 2 was signed immediately after.
Read the full incidentA Definition of Done Checklist for Software Teams, Written After Three Bad Sprints
Defect rate climbed for three consecutive sprints. I rebuilt the Definition of Done and moved the quality gate before the merge instead of after it, accepting slower throughput to bring leakage back down.
Read the full incident