← All writing

Duplicate is a claim about two problems, not two titles

Closing an issue as a duplicate looks like tidying. It is not. It is a technical claim, made early, on thin evidence: that fixing the other one will make this reporter's problem go away. When the claim is right it saves everybody a great deal of work. When it is wrong, it hides a second bug behind a closed issue, which is the most durable hiding place there is.

The claim is about problems. The evidence usually available at triage is titles, and titles are the worst evidence in the building.

The two ways it goes wrong

They are not symmetrical, and only one of them is ever noticed.

Same symptom, different cause

Two reports say the export is empty. One is an empty result set being written correctly. One is a timeout that produces a truncated file with a valid header. They look identical from the outside, which is exactly why they were filed with the same words. Fix the timeout and the first reporter's export is still empty, and their issue is closed, and they now believe you fixed it.

Different words, same cause

"Login loops back to the login page", "the app logs me out when I click Reports", and "session expires after 30 seconds" are three descriptions of one clock skew on one server. Nobody merges these, because no search finds them together, and so three people investigate the same thing in parallel without ever meeting. It is the mirror image of one issue that is really three.

The first failure is visible: somebody complains. The second is invisible and probably more expensive, and there is no trick that reliably prevents it. Reading the backlog occasionally is about the best that anyone has.

The test

Ask one question, out loud, before closing anything: if we ship the fix for the other issue, does this person's problem stop happening?

Sometimes you can answer that with confidence, and the close is safe. Often you cannot, because neither cause is known yet, and what you have actually noticed is that two issues resemble each other. That is worth recording, and it is not a duplicate. It is two open issues with a link between them, which costs almost nothing and stops being wrong the moment somebody finds the cause.

A guess, stated as a decision

Duplicate of #412. Closing.

The same guess, kept honest

This may be the same underlying thing as #412, which is also about exports finishing without content. Leaving both open until we know the cause. If #412 turns out to be the timeout, this one is separate, because here the file arrives instantly rather than after a wait.

What closing costs the reporter

There is a second cost that has nothing to do with correctness.

The person who filed the newer issue usually wrote more. They had a fresher example, a specific account, a time of day, a screenshot. The older issue is often the vaguer one, kept alive by seniority rather than quality. Closing the new one as a duplicate of the old one throws away the better report and keeps the worse one, and then tells the person who wrote it that their effort was redundant.

So move the detail before you close. It takes a minute and it is the difference between merging two issues and deleting one of them.

Worth the extra minute

Closing this in favour of #412, which reported the same thing first. Copied your two details across, because neither was on the original: it only happens on exports above about 20,000 rows, and the file that arrives has a header and no rows. That narrows it a lot. Thank you.

Which one to close

The convention is to close the newer issue and keep the older one, and it is a reasonable default because the older one holds the discussion, the links and whatever history exists. It is a default rather than a rule. When the newer issue is dramatically better written, keeping it and closing the old one loses less, as long as the pointer goes both ways so nobody arriving from a search or an old email lands on a dead end.

Link in both directions regardless. A closed issue that points at its replacement is a signpost. A closed issue that points at nothing is where the information went to die.

The thing worth remembering

Duplicates are not an administrative category. Every close is a claim that two people have the same problem, made before anybody knows what either problem is, and it is enforced by the fact that one of those people has stopped talking.

Most of the time the claim is right and the backlog gets smaller, which is why the habit forms. It is worth keeping the question in view anyway, because the cost of being wrong lands entirely on the reporter, who will find out months later, and quietly conclude that filing issues here does not achieve much.

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