BugMojoBugMojoBugMojo
FeaturesPricingBlogGuidesAbout
Log inGet started
BugMojoBugMojo

Bug reports that actually help fix bugs — capture, replay, share.

A product of Softech Infra.

Product

  • Features
  • Pricing
  • Get started
  • Log in

Resources

  • Blog
  • Guides
  • Compare
  • Glossary

Company

  • About
  • Contact
  • Privacy
  • Sitemap
  • Engineering
  • Playbooks
© 2026 BugMojo. All rights reserved.
AllGuidesEngineeringPlaybooksCompareGlossaryAlternativesBy roleBug tracking by framework
  1. Home
  2. Blog
  3. Playbooks
  4. The Bug Lifecycle: A Status Workflow That Scales From 3 to 300 Engineers
Playbooks

The Bug Lifecycle: A Status Workflow That Scales From 3 to 300 Engineers

An eight-state bug status workflow with per-severity SLAs, a single owner per transition, and the AI-first twist where every status is also an API and MCP action with a polymorphic MEMBER or AGENT assignee.

ManviManvi·Jun 5, 2026·7 min read
Playbooks
Isometric line-art of an eight-stage bug status pipeline with lime accents and member-or-agent owner icons
TL;DR

Run a bug through eight states: New, Triaged, In Progress, In Review, Verified, Closed, plus the side-paths Reopened and Will Not Fix. Tie SLAs to severity (split into response and resolution targets), assign one owner per transition, and keep Reopened distinct from New so rework stays measurable. In BugMojo every status is also a tRPC API and an MCP tools/call action with a polymorphic MEMBER or AGENT assignee.

A bug status workflow is the most over-engineered and under-thought artifact in most engineering orgs. Three-person teams invent fifteen statuses they never use. Three-hundred-person orgs let everything rot in a single "Open" column. The right answer is a small, fixed state machine where every transition has exactly one owner and every severity has its own clock.

This playbook gives you that state machine, the SLAs that hang off it, and the ownership map that keeps it honest. It is grounded in the ISTQB defect management model, Google SRE's incident roles, and DORA's 2024 metric reclassification. The BugMojo angle runs underneath: because the platform is AI-native, each status is simultaneously a UI control, an API endpoint, and a tool an AI agent can call.

What is the bug lifecycle and which statuses scale?

The bug lifecycle is the path a defect takes from report to closure. A workflow that scales uses eight states: New, Triaged, In Progress, In Review, Verified, and Closed on the main line, plus Reopened and Will Not Fix as side-paths. ISTQB describes the same skeleton abstractly as log, analyze and classify, decide a response, then close.

The ISTQB Certified Tester Foundation Level syllabus v4.0 (mandatory since 9 May 2024) defines defect management as a workflow for handling individual defects from discovery to closure. It is deliberately abstract, structured as four activities: log the reported anomaly, analyze and classify it, decide a response (fix or keep as-is), and close the defect report. It does not prescribe status names, which is exactly why one model can stretch across team sizes. The eight states below are the concrete expansion of those four activities.

The eight states, defined

  • New — Reported, not yet reviewed. Maps to ISTQB log.
  • Triaged — Severity and priority assigned, owner set. Maps to analyze and classify.
  • In Progress — A fix is being written.
  • In Review — The fix is in code review or an open PR.
  • Verified — QA or the original reporter confirmed the fix against the original repro steps.
  • Closed — Done and shipped. The terminal state.
  • Reopened (side-path) — A verified or closed bug regressed or failed verification.
  • Will Not Fix (side-path) — A deliberate decision to keep the behavior as-is. Maps to ISTQB decide a response: keep it.

A three-engineer team can collapse this to five live states (New, In Progress, In Review, Verified, Closed) and handle triage in standup. A 300-engineer org adds Triaged as a formal gate, makes In Review map to a required PR, and puts Will Not Fix behind product sign-off. Same skeleton, more governance.

What SLAs should you set per severity?

Do not set one global "fix bugs within N days" target. Tie SLAs to severity, and split each SLA into two clocks: a response target (first human acknowledgement plus triage) and a resolution target (reaching Verified or shipped). This mirrors the SLO-budget logic in the Google SRE book, where a faster error-budget burn rate pages a human sooner. Critically, severity is not priority: per BrowserStack, severity is an engineering-led measure of technical impact, while priority is set by product to decide timing. A critical crash in an internal-only testing tool can sit at low priority.

FeatureSeverityResponse (ack + triage)Resolution (Verified/shipped)
Critical (prod down, no workaround)S11 hour24 hours
High (major function broken, workaround exists)S24 hours3 business days
Medium (degraded, limited scope)S31 business daycurrent sprint
Low (cosmetic / minor)S41 weekscheduled into backlog

Measure adherence with DORA's failed deployment recovery time. The 2024 DORA report restructured its metrics into five and moved recovery time out of stability and into the throughput group, alongside change lead time and deployment frequency. That reframing is useful here: how fast you drive a Critical bug from New to Verified is a throughput signal about your delivery system, not just a stability footnote.

Who owns each status transition?

Ownership must be single-threaded per transition. The Google SRE book is blunt about why: without an explicit Incident Commander, the unmanaged alternative is multiple engineers independently making changes and a communication breakdown. The Commander holds high-level state and assigns work by priority. A bug workflow needs the same discipline, scaled down to one owner per arrow.

FeatureOwnerRole / rationale
New -> TriagedTriage lead or on-callSets severity (engineering-led)
Triaged priorityProduct managerSets timing; separate field from severity
Triaged -> In Progress -> In ReviewAssigned engineer (MEMBER or AGENT)Writes and opens the fix
In Review -> VerifiedQA or original reporterConfirms against original repro
Any -> Will Not FixProduct or eng leadDeliberate keep-as-is decision
Reopen vs. new bug

Reopen when the same defect returns: the fix failed verification, a regression reintroduced the original behavior, or the root cause was misdiagnosed. File new when the symptom differs, the affected component changed, or you found an adjacent defect while verifying. Keeping these distinct feeds DORA's deployment rework rate (the percentage of deployments that are unplanned bug-fix work). Conflate reopens with new reports and you hide how much of your throughput is rework.

The AI-first twist: every status is an API and an MCP action

In a traditional tracker, a status only changes when a human clicks a dropdown. BugMojo treats each status as three things at once: a UI control, a tRPC endpoint, and an MCP tool an AI agent can invoke. The Model Context Protocol 2025-11-25 spec makes tools model-controlled: a client discovers them with tools/list and invokes them with tools/call. The same spec carries a hard guardrail — there SHOULD always be a human in the loop with the ability to deny a tool invocation. That contract is what lets an agent move work without removing human control.

The enabling data model is the polymorphic assignee: assignee_type is MEMBER or AGENT, and assignee_id points at whichever it is. An agent can own In Progress while a human still owns Verified. Because BugMojo's extension captures rrweb session replay, console logs, network requests, and screenshots, an agent like Claude Code or Cursor reads real reproduction context before it touches a status.

mcp-tools-list-response.jsonjson
// AI agent discovers the status transitions via MCP tools/list
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "tools": [
      {
        "name": "bug.transition",
        "title": "Move a bug to a new status",
        "description": "Transition a bug through the lifecycle. Human can deny.",
        "inputSchema": {
          "type": "object",
          "properties": {
            "bugId": { "type": "string" },
            "toStatus": {
              "type": "string",
              "enum": ["TRIAGED", "IN_PROGRESS", "IN_REVIEW",
                       "VERIFIED", "CLOSED", "REOPENED", "WONT_FIX"]
            },
            "assigneeType": { "type": "string", "enum": ["MEMBER", "AGENT"] },
            "assigneeId":   { "type": "string" }
          },
          "required": ["bugId", "toStatus"]
        }
      }
    ]
  }
}
mcp-tools-call-request.jsonjson
// The agent moves bug-4821 to IN_PROGRESS and assigns itself.
// The host app SHOULD surface a confirmation a human can deny.
{
  "jsonrpc": "2.0",
  "id": 2,
  "method": "tools/call",
  "params": {
    "name": "bug.transition",
    "arguments": {
      "bugId": "bug-4821",
      "toStatus": "IN_PROGRESS",
      "assigneeType": "AGENT",
      "assigneeId": "agent:claude-code"
    }
  }
}

Copy-paste: a minimum viable workflow definition

Drop this into your tracker config or your team handbook. It is the smallest version that still enforces owners and SLAs.

  • States: NEW, TRIAGED, IN_PROGRESS, IN_REVIEW, VERIFIED, CLOSED, REOPENED, WONT_FIX
  • Required gate: a bug cannot leave TRIAGED without a severity and an owner.
  • Verification rule: only QA or the original reporter sets VERIFIED, and only against the original repro.
  • Reopen rule: REOPENED routes back to TRIAGED, never straight to IN_PROGRESS, so severity is re-confirmed.
  • SLA clocks: response = time in NEW; resolution = time from NEW to VERIFIED, bucketed by severity.
  • Audit: every transition records actor (MEMBER or AGENT), timestamp, and from/to status.
Key takeaway

Scale comes from constraints, not columns. Fix the state machine at eight states, give each transition one owner, hang two SLA clocks off each severity, and keep Reopened separate from New so rework stays visible in your DORA metrics. The AI-first layer is additive: expose the same transitions as MCP tools/call actions with a MEMBER-or-AGENT assignee, and keep the human's right to deny.

Two cross-references close the loop. The New-to-Triaged step is where most workflows leak time and accuracy; the mechanics of doing it well are their own discipline, covered in the bug triage glossary entry. And because the SLA table above hinges on the severity-versus-priority distinction, it is worth internalizing why those two fields have different owners before you wire up your clocks.

Run this workflow with AI agents that read real repro context
Try BugMojo free

Frequently asked questions

Frequently asked questions

Sources

  1. ISTQB Certified Tester Foundation Level Syllabus v4.0.1, Section 5.5 Defect Management — ISTQB (2024-11)
  2. ISTQB Foundation Level Syllabus 5.5 Defect Management — ASTQB (ISTQB US Board) (2024)
  3. Model Context Protocol Specification (2025-11-25): Server Tools — Model Context Protocol (2025-11-25)
  4. A history of DORA's software delivery metrics — DORA (Google Cloud) (2026-01-02)
  5. Google SRE Book: Managing Incidents — Google SRE (2024)
  6. Bug Severity vs Priority in Testing — BrowserStack (2025)
Share:
Manvi
Manvi· QA Tester

Manvi is a Quality Assurance Tester with three years of experience. For her, quality is not just about finding bugs — it is about ensuring the best possible experience for every user.

On this page

  • What is the bug lifecycle and which statuses scale?
  • The eight states, defined
  • What SLAs should you set per severity?
  • Who owns each status transition?
  • The AI-first twist: every status is an API and an MCP action
  • Copy-paste: a minimum viable workflow definition

Get bug-tracking insights, weekly.

Engineering deep-dives, QA playbooks, and honest tool comparisons. No spam — unsubscribe in one click.