Skip to main content
Reproduction Tips

Can't Reproduce That Bug? Fix Your Report, Not Your Luck

Reproduction is the backbone of bug tracking. Learn why vague reports fail, how priority and severity differ, and how to write steps that actually let a developer see the bug.

Why can't my developer reproduce this bug? It's the question we've all typed into a Slack channel, usually after a screenshot that shows a stack trace but no context. You're not alone. The gap between what you see and what the developer can recreate is the single biggest waste of time in bug tracking. Let's fix that.

Why is reproduction so hard for developers?

Because a bug report without reproduction steps is a rumor, not a defect. As Atlassian's documentation on the bug life cycle makes clear, a complete defect report includes reproduction steps, expected versus actual behavior, severity and priority, environment details, and visual proof. When you strip that down to a screenshot and a one-liner, you're forcing the developer to play detective. Most of the time, they'll close it as Non-Reproducible, and the bug will haunt you later. So the first rule is: if you can't write steps, you haven't actually seen the bug.

What's the difference between priority and severity?

They're not synonyms, and mixing them up is a classic rookie move. Severity measures how much the bug affects the system's functionality or user experience—think of it as the technical impact. Priority, on the other hand, measures how urgent it is to fix, which is a business decision. A low-severity typo on the login page might get a high priority if it's on the CEO's demo. Conversely, a fatal crash in an obscure feature could be low priority if no one uses it. Atlassian's guide on priorities is blunt: get these wrong, and you'll have developers fixing the wrong things. So when you write a report, assign both, but understand they are independent.

What's the best workflow for bug reproduction?

The simplest effective workflow is Open to In Progress to In Review to Done to Closed, with an optional Triage step at the start. Why does that help reproduction? Because it forces you to decide early whether a report is even actionable. If it fails triage—missing steps, no environment info, no proof—it goes back to the reporter before anyone wastes time. In our team, we treat "Non-Reproducible" as a red flag: it means the report was incomplete, not that the bug doesn't exist. We push it back for more detail, not to the backlog graveyard.

Is 'can't reproduce' a valid resolution?

Yes, but only as a last resort. The bug life cycle includes Non-Reproducible as a standard state, but it should be used sparingly. If a developer can't reproduce it, that's a signal to ask for more specifics, not to close it forever. In our practice, we only mark it Non-Reproducible after we've exhausted the report and the reporter. If the bug is critical, we might even schedule a screen-sharing session to watch it happen. The point is, 'can't reproduce' is a failure of communication, not a triumph of debugging.

How do I write reproduction steps that actually work?

Start with the environment. Include the browser, OS, device, and any relevant settings—the fact base insists on environment details, and they're non-negotiable. Then list steps in the order you took them, but be honest: you don't need to list every click, just the ones that matter. A common mistake is to skip a step that seems obvious to you, like being logged in as an admin. That's the step that breaks reproduction. Also, include visual proof—a screenshot or video—because it catches what words miss. And always state the expected versus actual behavior; if you don't, the developer has to guess what you thought should happen.

Should I prioritize severity over priority?

No, and here's where the myth-busting comes in. Many people treat them as interchangeable, but they're not. Severity is about the bug's impact on the system—Fatal/Blocker, Critical, Major, or Minor. Priority is about business urgency—Lowest/Trivial through Highest/Blocker. A bug can be high severity but low priority, or vice versa. For example, a crash in a rarely used report generator is high severity but low priority if no one's using it. Conversely, a cosmetic glitch on the pricing page is low severity but high priority because it affects revenue. If you conflate them, you'll misdirect the team. Atlassian's own guidance separates them clearly, and you should too.

What's the best way to handle a 'can't reproduce' from a developer?

Don't argue. Ask for specifics on what they tried, then go back and re-create your own steps. Nine times out of ten, you'll find you missed a step or a condition. If you still can't reproduce it, then it's time to get creative. Try the same steps on a different browser or device, or check if it only happens after a particular sequence. In our team, we keep a shared list of 'flaky' bugs that we can't reproduce, and we revisit them when we have time. But the real fix is to prevent the problem: use a bug template that requires reproduction steps, expected/actual, environment, and proof. That single change cut our 'can't reproduce' rate by half. It's not about luck; it's about discipline.

Takeaway

Reproduction isn't a lottery—it's a craft. If you write complete reports with steps, environment, and proof, you'll stop hearing 'can't reproduce' and start hearing 'fixed.' Remember, the bug life cycle is a tool, and you're the one who feeds it. So next time you're tempted to file a vague bug, think of the developer on the other side. Give them what they need, and they'll give you the fix.

Sources

  • Atlassian (bug life cycle) - https://www.atlassian.com/software/jira/guides/bug-tracking/bug-life-cycle
  • Atlassian (issue priority vs severity) - https://www.atlassian.com/software/jira/guides/issues/priorities
  • Bug tracking terminology - https://en.wikipedia.org/wiki/Bug_tracking_system

Share this article:

Comments (0)

No comments yet. Be the first to comment!