Most sprint planning problems don't show up in the planning meeting. They show up on day four, when someone realizes a story depends on an API that isn't ready yet, or that "done" meant something different to the person who wrote the ticket than to the person who picked it up. A short pre-flight check before committing to the sprint catches most of this early, when it's still cheap to fix.
Before the meeting
- Backlog is estimated, not just prioritized. Estimating during the planning meeting itself burns the meeting's time on math instead of decisions.
- Top stories have a clear "done." If two people on the team would describe "done" differently for a story, it's not ready to pull into the sprint yet.
- Known dependencies are flagged. External APIs, other teams, pending design assets — call these out before commitment, not after the story is already in progress.
During the meeting
- Capacity accounts for actual availability — holidays, on-call rotations, planned leave — not just the team's average velocity from a normal sprint.
- Every pulled story gets a two-line gut check: does anyone see a reason this doesn't fit in the sprint? Silence isn't the same as agreement — ask directly.
- Leave slack, not a packed sprint. A sprint scheduled at 100% of theoretical capacity has zero room for the inevitable production bug or urgent request. Plan closer to 80%.
If a story survives three sprints of "let's carry it over," that's usually not a scheduling problem — it's a sign the story is still too vague to actually start.
After the meeting
- The sprint goal is written down somewhere visible — not just spoken in the room. A one-sentence goal on the board keeps daily standups anchored to something other than a list of tickets.
- Anyone who missed the meeting gets a two-minute recap, not just access to the board. People who weren't in the room miss the reasoning behind the commitments, not just the list of them.
None of this adds meaningful time to sprint planning — most of it is a five-minute pass through a list before anyone commits to anything. The cost of skipping it shows up later, and it's almost always more than five minutes.