The Defect LedgerSeverity · priority · triage

Defect board › Bug Reports

Filing Bugs You Cannot Reproduce Is Still Worth Doing

Logged 2026-10-28

01 Overview

A bug report that cannot be reproduced on demand is not a failed report. It is an incomplete one, and incomplete is a normal state for a defect that appears intermittently. The instinct to discard it because it will not cooperate on command is understandable, but it throws away the only evidence the team has that something in the product is misbehaving under conditions nobody has mapped yet. The report is a claim about observed behavior, not a proof of cause, and it deserves to enter the queue on those terms.

The purpose of filing an unreproducible defect is to convert a single observation into a durable record. Once written down, the observation can be compared against future sightings, correlated with releases, and used to narrow the search space. A report that sits in a tracker with a clear description of what was seen, where, and when is worth more than a memory that fades by the next sprint. The craft here is not in forcing a reproduction; it is in capturing enough context that someone else can try, and in being honest about what is unknown.

This article treats the unreproducible report as a legitimate artifact with its own lifecycle. It covers what the report is actually claiming, how severity and priority differ when certainty is low, how to write steps that survive the absence of a reliable trigger, how triage should handle uncertain evidence, and what to do when the defect returns. The through line is that uncertainty is information, and the ledger should record it rather than hide it.

02 What the report is actually claiming

A reproduction-dependent report makes a narrower claim than it appears to. It does not claim the product is broken in a specific way on demand. It claims that under some set of conditions, a specific symptom was observed once, and that the conditions are not yet understood well enough to repeat. That distinction matters because it changes what counts as confirmation. You are not trying to prove the bug exists; you are trying to determine whether the symptom is real, how often it occurs, and what raises its probability.

The claim has three parts. First, the symptom: what the user or tester actually saw, described in observable terms rather than inferred cause. Second, the context: environment, version, account state, data, timing, and any recent change nearby. Third, the confidence: how sure the observer is that the symptom occurred as described, and whether anything was captured such as a log line, a screenshot, or a timestamp. A report missing the third part is still useful, but it should say so plainly rather than imply certainty it does not have.

When you frame the report this way, you also frame the investigation. The question stops being can we reproduce it and becomes what would have to be true for this to happen. That question invites hypotheses about race conditions, timing, cached state, data-dependent paths, and environment differences. It also makes room for the possibility that the symptom was caused by something outside the product, which is a legitimate outcome. The report is a lead, and leads are evaluated, not believed.

03 Severity versus priority

Severity describes how much damage the defect causes when it occurs. Priority describes when the team intends to fix it. These are independent axes, and an unreproducible report stresses both because neither can be stated with full confidence. You cannot assert severity for a failure you have seen once, and you cannot set priority without some sense of how often it happens and who it affects. The honest move is to record provisional values and mark them as provisional.

A useful habit is to separate the worst plausible outcome from the observed outcome. The observed outcome is what actually happened: a wrong total, a dropped request, a blank panel. The worst plausible outcome is what could happen if the same underlying condition occurred at a worse moment, such as during a payment or a save. Severity should be anchored to the observed outcome, with the plausible worst case noted as a reason to investigate rather than as a reason to inflate the rating. Inflating severity to get attention erodes trust in the field and makes triage harder for everyone.

Priority, meanwhile, is a scheduling decision the team owns. A low-severity intermittent glitch on a rarely used screen may still deserve priority if it hints at a systemic problem, while a cosmetic flicker that appears once may sit deferred for a long time. The reporter's job is to supply evidence and context, not to demand a schedule. When severity and priority are both uncertain, say so in the report and let triage assign the values with the information available. Revisit them if the defect returns with more data.

04 Writing steps someone else can follow

When you cannot reproduce a defect, the steps section changes character. It stops being a recipe that reliably triggers the bug and becomes a description of the path you were on when the symptom appeared. Write it as a narrative of the attempt, in order, with enough detail that another person can walk the same path and watch for the same result. Include what you expected, what you saw, and what you did immediately before and after.

Be specific about state. Note the account, the data set, the feature flags, the build or version, the browser or device, the network conditions if relevant, and the time of day if timing might matter. Mention anything unusual: a slow response, a retry, a tab left open, a background job, a recent deploy. These details feel mundane when you write them and become valuable when someone is hunting for a pattern across several reports. Avoid summarizing; the summary is where the signal gets lost.

Also record what you tried in order to reproduce it and what happened each time. A list of failed attempts is not wasted effort; it is a map of the search space that has already been ruled out. If the symptom appeared once in twenty attempts, say that. If it appeared after a specific delay, say that. If you are unsure whether a step mattered, include it and mark it as uncertain. The goal is not a clean recipe but an honest trace that a colleague can extend.

05 Running the triage queue

Triage is where uncertain reports either gain a path forward or stall. The routing decision should assign an owner, a provisional severity, a priority, and a next action. For an unreproducible defect, the next action is often investigate, monitor, or request more information, and each of those is a legitimate outcome. What is not legitimate is leaving the report in a vague state where nobody owns the next move. A report without an owner is a report that will be rediscovered painfully later.

A practical approach is to treat the queue as a set of hypotheses rather than a set of confirmed defects. Group reports that share a surface, a symptom shape, or a timing pattern, because clusters are often more informative than individual entries. A single intermittent failure may be noise; three reports of the same symptom on the same surface within a release window is a signal worth escalating. Triage should look for those clusters and connect them, even when no single report is reproducible.

Triage should also be willing to close reports with a documented rationale. Closing as cannot reproduce without explanation teaches reporters that filing is pointless. Closing with a note that describes what was tried, what would make the report actionable, and how to reopen it keeps the ledger honest and keeps the reporter engaged. The decision to defer is also valid, provided the deferral has a trigger such as a new sighting or a related change. Every routing decision should leave a trace.

06 When a defect comes back

The second sighting is the most valuable event in the life of an unreproducible report. It confirms the symptom is real, and it gives you a second data point to compare against the first. The first thing to do is link the new observation to the original report rather than filing a fresh one in isolation. Linking preserves the history and turns two isolated notes into a pattern. Then compare the two contexts carefully: what was the same, what was different, and what changed in between.

Look for the variables that moved together. If both sightings occurred shortly after a deploy, or on the same account, or after a long idle period, that correlation is a hypothesis worth testing. If the contexts differ in every respect except the symptom, that points toward a deeper shared cause. Either way, the report should be updated with the new evidence, the severity and priority revisited, and the next action reassigned. A returning defect often deserves more investigation effort than it received the first time.

If the defect returns repeatedly without a clear pattern, consider whether the team needs better instrumentation rather than more guessing. Additional logging, timing capture, or state snapshots around the affected area can turn an unreproducible symptom into a reproducible one. That work is a legitimate outcome of triage, not a distraction from it. The ledger exists to remember what the product did, and a defect that keeps coming back is telling you where to look next.

07 Frequently asked questions

Is it worth filing a bug I saw only once? Yes, provided the report is honest about the uncertainty and includes the context you had at the time. A single sighting is weak evidence, but it is evidence, and it becomes stronger when linked to later sightings. The alternative, saying nothing, guarantees the team learns nothing. File it, mark it as unverified, and let triage decide how much weight to give it.

Should I guess at severity if I cannot reproduce it? Give a provisional severity based on the observed outcome, and say clearly that it is provisional. Do not inflate it to force attention, and do not bury it to avoid seeming alarmist. If the worst plausible outcome is much worse than what you saw, note that as a reason to investigate, not as the assigned severity. Triage can adjust the value once more is known.

What if my steps do not reproduce the bug for anyone else? That is expected for intermittent defects, and it does not invalidate the report. Your steps describe the path you took, not a guaranteed trigger. Include what you tried and what happened, and let the next person extend the trace. Over time, several partial traces often reveal the condition that a single perfect recipe would have shown.

How long should an unreproducible report stay open? There is no universal answer, but every report should have an owner and a next action. If the next action is monitor, set a review point or a trigger such as a new sighting. If the action is investigate, give it a bounded effort and record what was learned. Closing with a documented rationale is fine; closing silently is not. The point is to keep the ledger truthful about what is known and what remains open.