← All writing

"Cannot reproduce" is a status, not a verdict

Somebody reported a problem. You followed the steps, the software behaved, and you closed the issue as cannot reproduce. Two things are now true at once: they saw something, and you did not. Closing the issue settles that by picking one of them, and it picks the wrong one, because the person holding the evidence is the one who has just been removed from the conversation.

"Cannot reproduce" is an accurate account of what happened when you tried. It is not a finding about the software. The distance between those two sentences is where intermittent reports come from for the next three months.

The difference is state, not honesty

Almost nobody invents a bug. The overwhelmingly likely explanation is that their machine differed from yours in a way neither of you thought to mention, because to each of you it was simply how things are. There are four usual hiding places.

Their data

You tested with a fresh account holding eleven records. They have four years of history, a customer whose name contains an apostrophe, and one row that predates a migration. Data is the most common difference and the least often mentioned, because nobody thinks of their own data as unusual.

Their build

Version numbers get asked for and then not checked. The reporter may be on last week's release, on a cached bundle their browser has not given up, or on the exact build you are running but with a feature flag resolved differently for their account.

Their permissions

You tested as somebody who can do everything. Most people cannot. A surprising number of unreproducible bugs are a permission check firing correctly and being reported as a broken button.

Their sequence

You performed the steps cleanly, in order, in one minute. They arrived at step four from somewhere else entirely, after twenty minutes on the page, having opened a second tab and let a token quietly expire. The steps in the issue are the route they reconstructed afterwards, not the route they took.

The question that costs the least

Before anything else, ask whether it happens every time.

It is one question, answerable from memory, requiring no setup and no technical vocabulary, and it splits the search in half. Every time means the difference is in configuration, data or permissions, and is sitting still waiting to be found. Once means the difference is in timing or sequence, and no amount of careful step-following will surface it.

Ends the thread

I followed your steps on the latest version and it works fine for me. Are you sure you were logged in? Closing as cannot reproduce, please reopen with more detail if it happens again.

Continues it

I have not managed to make this happen yet, so I am missing something. Does it fail every time you try, or did it happen once?

The second version admits the same thing as the first. The difference is where it puts the fault: in the information available, rather than in the person who supplied it. Nobody answers a question that arrived attached to an accusation.

When you genuinely cannot

Some problems cannot be reproduced, ever, by anyone. That is a real outcome and pretending otherwise leaves issues open forever. The thing that makes it survivable is writing down what you tried.

Unusable in six months

Cannot reproduce. Closing.

Usable when the next report arrives

Tried on 4.2.1 and on the 4.3 beta, Chrome and Safari, as both an admin and a standard member, ten attempts each, with an account of about 200 records. Never failed. Closing for now. If anyone hits this again, the useful thing to capture is the exact time it happened so we can find the request in the logs.

That second comment does three jobs the first cannot. It stops the next person repeating your work. It shows the reporter they were taken seriously, which is what determines whether they file the next one. And it names the single piece of evidence that would change the outcome, which is far more likely to arrive than an unprompted "more detail".

What the wrong close actually costs

It is tempting to price this in bugs: the failure was real, it stayed in, someone hit it later. That is the smaller half.

The larger half is the reporter. Filing an issue is unpaid work with a delayed and uncertain payoff, and being told the thing you saw did not happen is a reliable way to stop somebody doing it again. They do not announce this. They just quietly route around you, and the next problem they notice goes to a colleague, or into a private channel, or nowhere. A backlog that gets quieter is not always a backlog that is improving.

The status, used properly

Kept as a status, cannot reproduce says something true and useful: we looked, and what we have is not yet enough. It sits alongside a specific request and invites the one fact that would move things.

Used as a verdict, it says the problem was not real, on the authority of the person with the least evidence. It is the only triage outcome that reliably destroys the input it depends on.

WhatProblem asks these questions for you

It reads new GitHub issues and asks what is missing, in the issue thread, before anyone on your team has to.

Install from GitHub Marketplace