L1 · Running the work
L1Core4 min read

Writing a bug report that gets fixed

The same bug, two reports: one is closed as cannot-reproduce, the other gets a fix that afternoon. The difference is steps, environment, evidence and a plain statement of what you expected instead. This is the most visible thing you produce all week.

Two people call a plumber about the same problem.

The first says: "There is water everywhere in the kitchen." The plumber asks four questions, cannot picture it, and offers a slot next Tuesday.

The second says: "The pipe under the kitchen sink drips, but only while the dishwasher is running. It started after we moved the dishwasher on Saturday. There is a bowl catching about a cup an hour." The plumber knows what to bring and comes today.

Same leak. A bug report template is just the second version, written down so you produce it every time.

The seven lines of a bug report

  • Title. What breaks and when, in one line. "Partial gift-card redemption rounds the balance down by 1p" rather than "Gift card bug".
  • Environment. Build or version, environment name, browser and version, account used.
  • Steps. Numbered, starting from a state anybody can reach, with real data values.
  • Actual result. What happened, quoted or shown, not summarised.
  • Expected result. What should have happened, and where that expectation comes from.
  • Evidence. Screenshot, video, network response, log excerpt, run id.
  • How often. Every time, or two in five. This one line changes how the bug gets prioritised.

Why you should care about this

Because the report is the most visible thing you produce all week, and it is judged.

An engineer who reads a clear report spends their time on the fix. An engineer who reads a vague one spends it interviewing you, and after the third round of that your reports get read last. Nobody says this out loud, but everybody sorts their queue this way.

There is also a hard commercial edge. A bug that arrives with reproducible steps and evidence gets triaged on the facts. One that arrives as a paragraph of prose gets triaged on how confident the reporter sounded, which is not a system anybody should want.

How to write one that gets fixed

  1. Reproduce it twice before you write. Once to see it, once to work out the shortest path. The second run is where you discover which step is actually required.
  2. Start the steps from a known state. A named account, a seeded card, an empty basket. The same discipline as writing a test case a stranger can run.
  3. Quote the actual result. The exact error text, the exact number on screen. "The total was wrong" tells the reader nothing they can search for.
  4. Say where the expectation comes from. The acceptance criteria, the policy document, the design. Otherwise the discussion becomes your opinion against theirs.
  5. Attach the smallest useful evidence. One screenshot with the number visible beats a four-minute video.
  6. Note the frequency. Two in five attempts is a different bug from every time, and it points at data or timing.
  7. File it against the case if you have one. A report joined to a case and a run answers "when did this last work" without archaeology. That is what a record a release rests on is for.

The engineer is not being difficult. They are trying to see what you saw, using only the words you gave them.

The same bug, both ways

For example, here is the report that goes nowhere and the one that gets fixed, for the same defect in the gift-card release at Willow Books.

bug-report-both-ways.txt
THE VERSION THAT GETS CLOSED
  Title: Gift card total is wrong
  Steps: buy a gift card, use it at checkout, the total is wrong
  Expected: the correct total
  -> engineer cannot reproduce, asks three questions, moves on

THE VERSION THAT GETS FIXED
  Title      Partial gift-card redemption rounds the remaining balance
             down by 1p when the order total ends in .49

  Environment
             build rc-2026-09-04.3, staging
             Chrome 141 on macOS 15.4
             account [email protected]
             gift card GIFT-7QK4-2210, balance 25.00

  Steps
             1  log in as [email protected]
             2  add "Piranesi" 9.99 and "Mrs Dalloway" 22.50 to the basket
                (basket 32.49, delivery 3.50, order total 35.99)
             3  go to Checkout
             4  enter GIFT-7QK4-2210 in the Gift card field, select Apply

  Actual     order summary shows "Gift card applied: 25.00" and
             "Remaining to pay: 10.98"
             gift card balance page then shows 0.01 remaining

  Expected   remaining to pay 10.99 and a balance of 0.00
             (WB-1802 acceptance criteria: "the card is fully consumed
             before the payment method is charged")

  Evidence   screenshot checkout-1p.png
             POST /api/checkout/apply-gift-card response attached
             run id GC-004 / rc-2026-09-04.3

  Frequency  every time, 5 of 5 attempts, only when the order total
             ends in .49 or .99

  Note       10.98 + 25.00 = 35.98, so a penny is lost rather than moved.
             Looks like a rounding step applied twice.

The last two lines are worth copying as a habit. Naming the pattern (only totals ending in .49 or .99) and doing the arithmetic out loud turns a report into a lead. That is often the difference between a fix this afternoon and a fix next sprint.

How to show you know it

  • A before-and-after pair like the one above, from your own tracker. It is the clearest demonstration of the skill that exists.
  • A pattern in the frequency line. Spotting that it only happens on certain totals, browsers or accounts is the tester's contribution to the fix. Run history is where those patterns hide.
  • A closed-as-cannot-reproduce report you rescued. Finding the missing state and reopening it with steps that work is a good interview story.
  • Reports joined to cases and runs. It shows you think about the record and not only the ticket.

Questions

What is the ideal bug report template?

The seven lines above. Any tracker's form is a wrapper around them. Where a form has fifteen fields, most people fill four properly, so a short report done well beats a long one done partly.

How much evidence is too much?

Attach the smallest thing that shows the problem. One screenshot with the wrong number visible, plus the response body if the problem is in the data. A long video makes the reader hunt for the moment, and they may not.

Should I diagnose the cause?

Offer what you observed, not a verdict. "10.98 plus 25.00 is 35.98, so a penny is lost rather than moved" is an observation and it is genuinely useful. "The rounding function is broken" is a guess that can send someone down the wrong path.

The bug only happens sometimes. Is it worth filing?

Yes, with the frequency stated and any pattern you noticed. Two in five with a note about which accounts is far more useful than waiting until you can make it happen every time.