P07 min readUpdated

Defect backlog hygiene beats writing more cases

Stale bugs drain more engineering time than missing coverage. How I sweep a defect backlog, close what is dead with a reason and leave a board Product and Engineering both believe.

Closed · invalid / duplicateClosed · invalid / duplicateOpen · P1 ownedOpen · needs triageOpen · needs triage−noise

Teams often respond to quality pressure by writing more test cases. That feels productive. It rarely fixes the real drag: a defect backlog full of duplicates, zombies and tickets nobody trusts.

Defect backlog hygiene is the unglamorous work of making every open ticket mean something. When I join a programme I read the backlog before I write a single case, because it shows me how the team talks about quality. A board with hundreds of open defects, many of them older than the screens they describe, tells me that nobody reads it.

Why a stale defect backlog costs more than missing test cases

A missing test case costs you once, when the thing it would have caught gets through. A stale ticket costs you every time someone touches the board. It is re-read in triage. It is counted in the release readiness note, where “63 open defects” means nothing if nobody knows how many still reproduce. It turns up in search, so a new tester cannot tell whether what they have just found is already known, and logs it again.

The worst cost is trust. Once engineers have picked up two or three tickets that turned out to be fixed long ago, they stop believing the board, and the real defects sitting beside the dead ones get the same shrug. Product stops reading it for the same reason. From then on the defect conversation happens in chat, and the backlog is an archive.

More test cases make this worse. New cases find new failures, which land in the same fog, and some of them fail on defects that were logged long ago and forgotten.

Three questions every open defect should answer

I treat the backlog as a product surface: something people use to make decisions, which either works or does not. Every open defect should answer three questions.

  • Is it still real? It reproduces on the current build, in an environment that still exists, against behaviour the product is still meant to have.
  • Who owns the next action? A named person, and the action itself: fix, decide, supply information or retest. “The team” is not an owner.
  • What happens if we ship without it? One sentence on what the user meets and how bad that is. This is the line Product needs, and I cover how to write it in Defects Product thanks you for.

A ticket that cannot answer all three is not waiting for a fix. It is waiting for someone to look at it.

How to clean up a defect backlog

The method is deliberately boring. I work in passes across the whole backlog, because each pass makes the next one smaller.

  1. Sweep by age and status. Sort by last update, oldest first, and look hardest at the statuses where tickets go to wait: reopened, needs information, blocked, in progress with no activity.
  2. Retest what you can. Run the old ones against the current build. Some will have been fixed by other work. Others belong to a feature that has since been redesigned.
  3. Close what is invalid or unreproducible. Always with a clear comment: which build and data you tried, and how to reopen it.
  4. Merge duplicates. Keep the clearest ticket, link the others to it, and carry across any environment or account the duplicates mention.
  5. Re-prioritise sparingly. Only what still threatens users or release confidence moves. The sweep is no reason to re-argue the whole board.
  6. Give every survivor an owner and a next action. That includes the ones whose next action is a Product decision to fix or to leave.

The closing comment is where the courtesy lies. Someone took the time to log that ticket, and a silent close tells them it was not worth a sentence.

Closing comment on an old defect (illustrative)
  • Closing as cannot reproduce.
  • Retested on build 6.4.1, pre-production, with a tenant admin account and the order data from the original report.
  • The export now completes and the totals match the screen. Probably fixed by the reporting rework in 6.2.
  • If you still see this, reopen with the build number and the account you used, and I will pick it up the same day.

I do not close on age alone. Age is a reason to look. A two-year-old defect that still corrupts an export is a two-year-old risk, and the sweep is often the first time anyone has put it in front of Product as a choice.

For defects that are real but that nobody intends to fix, the decision belongs to Product. I ask for an explicit “won’t fix” with the reason written in the ticket. Leaving it open for another two years is the same decision, made by nobody.

A defect dashboard Engineering and Product both read

Then I publish a short dashboard so that Engineering and Product see the same picture. I have built these in JIRA and in Azure DevOps, and the useful ones are small: open defects by severity against the journeys they affect, how old they are, which have no owner, and how many came in and went out this sprint. It runs from saved queries, so nobody spends an afternoon counting.

The dashboard is what stops the backlog rotting again. A sweep happens once. Hygiene is the half hour each sprint that keeps the three questions answered. Defect hygiene is one of the rows in the Quality Maturity Matrix I use with leadership, because it is something they can watch move from one quarter to the next.

As Test Practice Manager on a global facilities programme I owned a stale defect backlog and ran it this way. The effect showed in the conversation more than in any count. Engineers spent noticeably less time re-triaging the same issues, and the defect discussion became roughly 40–50% more efficient.

Objections to closing old defects

“Closing tickets is hiding problems.” It would be, if they were closed silently. Closed is not deleted. The ticket is still searchable, and it carries the reason, the build it was checked on and the way back. What hides problems is a board so noisy that the serious defect on page four is never read.

“We do not have time for this.” The time is already being spent, a few minutes at a go, in every triage and every release report. The sweep moves it to one place and ends it.

What can really go wrong is closing something that is still broken. That is why the retest comes before the close, and why the comment invites a reopen. When a ticket does come back with new information, I count that as the process working.

More cases can still matter. They matter more after the backlog is honest, because then a failed case lands on a board people read, next to defects that are known to be real. Before that, you are documenting a fog.

Questions I get asked

How do you clean up a defect backlog?

Work in passes. Sort by last update and review the oldest tickets and the stalled statuses first. Retest on the current build. Close what is invalid or cannot be reproduced, with a comment giving the build, the data and how to reopen. Merge duplicates into the clearest ticket. Then give every remaining defect a named owner and a next action, and re-prioritise only those that still threaten users or the release.

Should old defects be closed automatically?

Not on age alone. Age tells you a ticket needs looking at, and some old defects turn out to be fixed or obsolete once retested. But an old defect that still reproduces is a long-standing risk. Retest it, and if nobody intends to fix it, ask Product for an explicit decision recorded in the ticket, so that leaving it is a choice someone made.

How often should a defect backlog be reviewed?

After one thorough sweep, a short review each sprint is enough: about half an hour checking that every open defect still reproduces, has an owner and has a next action. A small dashboard showing age, severity and unowned tickets makes drift visible early, which is cheaper than another large clean-up a year later.

Filed under Defect management and backlog hygiene. Terms: Defect backlog, Defect triage.