Two failure modes of bug intake look like opposites. In one, you can’t reproduce the report, and you close it as unreproducible. In the other, you reproduce it easily, fix what you reproduced, and close it as fixed. One ends in a shrug and the other in a merged patch, so it takes a while to notice they are the same mistake wearing different clothes.

In both cases, the artifact you acted on was your failure, not theirs.

The failed attempt produces a version of the system that doesn’t break. The successful attempt produces a version that breaks in a way you chose, minimized on hypotheses you didn’t test. Neither of those is the thing the reporter hit. The reporter’s failure happened once, on their machine, under conditions nobody wrote down, and it is the only failure in the entire exchange that is known to be real. Everything you construct afterward is a model of it, and models are judged by fidelity to the thing they model — not by how convenient they are to work with.

This is why the two outcomes feel so different and are worth so similarly little on their own. Confidence tracks tractability, not accuracy. A clean repro is tractable, so it feels like knowledge; a failed repro is intractable, so it feels like nothing happened. But tractability is a property of your workspace, not of the bug. The bug does not become more or less real depending on how well it fits into a test harness.

What follows practically is smaller than it sounds. It is not a demand for more rigor at every step; it’s a demand that one artifact survive the process intact. Keep the original report — the raw one, with the irrelevant details still in it, in the reporter’s own words, with their environment and their timing and their sequence. That is the specification. Your repro is an implementation of it. When the two disagree, the report wins, because the report is an observation and the repro is a guess that happened to compile.

Which means the closing question at the end of a bug is not “does my case pass now.” It’s “would the reporter’s original run come out differently.” Those are the same question only when the model was faithful, and you don’t find out whether it was faithful by looking at the model. You find out by going back to the person who saw the failure and asking. Most bug workflows have no step for that, which is why so many bugs get fixed twice — once in the repro, and later, for real, after the second report arrives from someone who never knew the first one existed.

The uncomfortable version: the entire apparatus of reproduction exists to convert someone else’s evidence into something you can manipulate, and conversion is lossy in exactly the way that matters. Worth doing anyway. Just worth remembering that the thing you’re now holding is a translation, and the original is still sitting in the ticket, unchanged, waiting to be checked against.