How to triage issues on a small project.

•

•

Twenty Open Issues and One Maintainer

I once spent an entire weekend at a logistics startup trying to implement a “sophisticated” Jira-based workflow with custom priority matrices and automated escalation rules, only to realize we were just adding overhead to a team of four people. We didn’t need a complex ecosystem; we needed to know which fire to grab first. Most advice on how to triage issues on a small project assumes you have a dedicated PM and a backlog of five hundred tickets, but in the real world, you usually just have a Slack notification and a growing sense of dread. You don’t need a framework; you need a method that actually works when you’re tired and the codebase is screaming.

I’m not going to sell you on some enterprise-grade methodology that requires a certification to understand. Instead, I want to share the blunt, unpolished way I handle chaos—the way I learned by watching production environments melt down. I’ll show you how to categorize problems based on actual impact rather than arbitrary labels, and how to build a system that survives the inevitable 2 AM emergency. This isn’t about optimization; it’s about staying sane while keeping the lights on.

Table of Contents

Prioritizing Bug Reports When Everything Feels Urgent

Prioritizing Bug Reports When Everything Feels Urgent

When the Slack notifications start hitting all at once, the natural instinct is to treat every bug like a house fire. In a small team, there is no dedicated support tier to act as a buffer, so everything lands directly on your plate. I’ve learned the hard way that if you try to fix everything simultaneously, you end up fixing nothing well. You have to stop looking at the sheer volume of tickets and start looking at the blast radius. A typo on a landing page is annoying, but it isn’t a priority. A broken checkout flow or a database connection leak is.

Effective prioritizing bug reports isn’t about being a hero; it’s about a realistic team bandwidth assessment. I usually pull up our issue tracker and ask one question: “If we don’t fix this by tomorrow morning, will someone actually lose money or sleep?” If the answer is no, it goes into the backlog. This isn’t about ignoring problems, but about making sure we aren’t wasting our limited energy on edge cases while the core infrastructure is fraying. You have to be comfortable letting the small stuff sit so you can actually protect the stability of what matters most.

Why Your Current Issue Tracking Best Practices Are Failing

Why Your Current Issue Tracking Best Practices Are Failing

Most of the issue tracking best practices I see in textbooks assume you have a dedicated PM and a rotating squad of engineers. In a small team, that’s a fantasy. We usually end up following these bloated project management workflows that demand a level of administrative overhead we simply can’t afford. You spend more time tagging labels, moving cards between columns, and arguing over “severity” vs. “priority” than actually fixing the code. It’s a performative ritual that feels like work, but it doesn’t actually move the needle when the service is lagging.

The real problem is that these systems fail to account for our actual team bandwidth assessment. They treat every ticket as an isolated unit of work, ignoring the fact that our context switching is our biggest tax. When you try to apply rigid resource allocation strategies designed for a hundred-person engineering org to a three-person shop, you just create a bottleneck of “important” tasks that no one has the mental capacity to touch. We end up managing technical debt by accident because we’re too busy maintaining the tool meant to help us manage it. It’s a loop of inefficiency that I’ve seen derail more small projects than actual code bugs.

Five ways to stop the bleeding without a dedicated QA team

  • Stop treating every ticket like a fire. Just because a user is shouting in Slack doesn’t mean the database is melting. I’ve learned to separate “someone is annoyed” from “the system is losing money.” One is a priority; the other is an emergency.
  • If you can’t reproduce it, don’t let it sit in your sprint. A bug report that says “it doesn’t work” is just noise. I make it a rule: if there are no logs, no steps to reproduce, and no environment details, the ticket goes back to the reporter. I don’t have the bandwidth to be a detective for vague complaints.
  • Use the “Blast Radius” metric. When I’m looking at a new issue, I ask: how many users does this actually touch? If it’s a broken button on a legacy settings page used by 2% of people, it stays at the bottom. If it’s the checkout flow, everything else stops.
  • Write the fix before you write the code. I’ve started treating my triage notes like a mini-spec. If I can’t clearly describe how the fix will change the system’s state, I don’t actually understand the problem yet. This prevents that mid-fix realization that you’ve just opened a much bigger hole.
  • Automate the boring stuff early. You don’t need a massive Jira setup, but you do need a way to catch the low-hanging fruit. If a bug is a regression, it shouldn’t be a triage item next week—it should be a failing test case today. If it’s not in a test, it’s just a ticking time bomb.

The things I actually keep in my notes

Stop chasing every minor UI glitch; if it doesn’t threaten the integrity of the data or the ability to process a transaction, it can wait until Monday morning.

Always document the “why” behind a fix, not just the “how,” because I’ve spent far too many hours debugging a problem I thought I’d already solved two years ago.

Triage is about managing your own sanity as much as the codebase, so build a system that tells you what to ignore so you can actually sleep.

The Goal Isn't Perfection

The Goal Isn't Perfection in software triage.

At the end of the day, triage isn’t about finding a perfect mathematical formula to rank tickets; it’s about reducing the cognitive load on the people actually writing the code. We’ve talked about moving away from bloated tracking systems and instead focusing on what actually breaks the user experience versus what just looks annoying in a spreadsheet. If you can identify the difference between a “the database is locking up” emergency and a “this button is the wrong shade of blue” request, you’ve already won half the battle. The objective is to build a sustainable rhythm where you aren’t constantly reacting to the loudest voice in the room, but rather the most impactful failure in the system.

I’ve spent enough time in production outages to know that the most dangerous thing isn’t a bug—it’s the chaos that follows when you don’t have a clear way to decide what to fix first. Don’t get hung up on finding the “correct” tool or the most sophisticated workflow. Just focus on making sure that when the next incident happens, you have enough context and clarity to act without panicking. Write it down, keep it simple, and remember that good triage is a defensive play designed to protect your time and your sanity.

Frequently Asked Questions

How do I stop the "loudest" stakeholder from hijacking the triage process when they aren't actually reporting a technical blocker?

You need a buffer. I learned this the hard way at the insurance firm: if you let the loudest person drive the triage, you’ll spend all week fixing “annoyances” while the actual data integrity issues rot in the background.

At what point does a manual triage process become a liability that actually costs more time than the bugs themselves?

It becomes a liability the moment you spend more time debating the ticket than actually fixing the code. If I’m looking at a spreadsheet or a Jira board for forty minutes just to decide what to work on next, the system has failed. When the “process” starts feeling like a second job—and you’re spending more time categorizing bugs than resolving them—you aren’t triaging anymore; you’re just performing administrative theater.

How do you decide when a bug is actually worth fixing versus just documenting it as a "known limitation" and moving on?

I use a simple rule of thumb: if the bug forces a user to change their mental model of how the system works, fix it. If they can work around it by just clicking a different button or waiting ten seconds, it’s a known limitation. I’ve learned the hard way that “minor” edge cases eventually become the primary way people use your software. If it breaks the contract of what the code says it does, it’s a bug.

What’s the best way to keep a triage backlog from becoming a graveyard of issues that everyone has collectively decided to ignore?

The graveyard happens because you’re treating the backlog like a storage unit instead of a queue. If an issue stays unaddressed for two sprints, it’s not a task; it’s noise. I’ve learned that if you can’t define the “cost of doing nothing,” the ticket shouldn’t exist. Either schedule it, or kill it. I’d rather have twenty meaningful tickets than two hundred ghosts that just make the dashboard look intimidating. If it’s not worth fixing now, delete it.

Tomasz Wierzbicki

About Tomasz Wierzbicki

I am not interested in arguing about frameworks. I am interested in why the thing broke at two in the morning and what would have prevented it. Most of what I know came from being wrong in production and writing it down afterwards.