•
Drizz raises $2.7M in seed funding •
•
Featured on Forbes
•
Drizz raises $2.7M in seed funding •
•
Featured on Forbes

Key takeaways
The defect life cycle is sequence of states a bug moves through from moment it's reported until it's permanently resolved. Every generic post covers same 7-11 states with same flow diagram. This one goes into 12 states that actually exist in mature bug tracking, transitions between them, and where flow breaks on mobile teams specifically.
Bug life cycle in mobile QA has to account for things a web-only life cycle doesn't. Device fragmentation, OS version regressions, and a verification problem where dev and QA are testing on different devices are all defect life cycle complications that don't show up in generic model. Density measures outcome of many defect life cycle runs, not any single bug, and per-state metrics tell a different story than aggregate ones.
The defect life cycle is a state machine. The bug is a token. The states describe where bug is in process. The transitions describe who moved it and why.
Standard SERP content presents it as a linear flow. It isn't. It's a graph with cycles, dead ends, and asymmetric transitions. IEEE 1044-2009 (Standard Classification for Software Anomalies) is underlying reference most bug tracking tools build on, even when they don't cite it directly.
What life cycle actually captures:
What life cycle doesn't capture (but should):
Severity and priority get set at start of defect life cycle and change as bug moves through it. A bug initially triaged as "medium severity, low priority" can be reclassified when a customer support ticket surfaces same issue affecting hundreds of users. That reclassification needs to happen inside life cycle, not as a separate process.
Standard posts cover 7-11 states. The real number in a mature bug tracking setup is closer to 12. Here they are with what each actually means.
1. New (or Reported)
A tester, developer, automated test, or end user has logged something. Nobody has looked at it yet. This is intake queue.
The state exists to acknowledge receipt without committing to action. In a healthy team, bugs don't stay in New for more than 24 hours.
2. Triaged
A QA lead or triage team has reviewed bug. They've confirmed it's:
Some teams skip triage and go from New straight to Assigned. That works at 5 bugs a week. It breaks at 50 bugs a week.
3. Assigned
A specific developer owns bug. They may not have started yet, but accountability is now on them.
4. In Progress (or Open)
The developer has started investigating or fixing. Work is happening.
5. Fixed (code committed, not verified)
The developer believes bug is fixed. Code is in a branch, PR, or merged to main. QA hasn't verified.
This is state that gets abused most. Devs mark bugs Fixed when they think they've fixed them. Sometimes fix works. Sometimes it doesn't. Sometimes it introduces a new bug. The state doesn't guarantee anything except developer intent.
6. Ready for Verification
The fix is in a build QA can test. Different from Fixed because Fixed means "in code" and Ready for Verification means "in a build QA can install and check."
Skipping this distinction is a common source of "we can't verify fix because build isn't ready yet" delays.
7. Verified (or Retested Pass)
QA has tested fix on affected build and confirmed it works. The bug is functionally resolved.
8. Closed
The bug is done. No further action required. Either verified and released to users, or verified and part of pending release.
9. Reopened
QA (or a user) confirms bug is still present after it was marked Fixed or Closed. The bug returns to developer's queue with a special flag: this was supposed to be fixed and wasn't.
Reopens are important signals. High reopen rates mean fixes aren't being verified properly, or underlying issue was misunderstood.
10. Deferred
The bug is valid but won't be addressed in current release cycle. Scheduled for a future sprint or release.
Deferred bugs need expiration dates. Otherwise they accumulate forever and pollute backlog.
11. Duplicate
The bug is a rediscovery of one already in system. Linked to original, closed for tracking purposes.
12. Rejected (Not a Bug or Won't Fix)
The reported behavior is correct as specified, or product decision is not to fix. Includes:
Rejecting a bug needs justification. Just closing it without explanation is how tester-developer relationships break. False positives clog defect life cycle with tickets that get closed without any code changing, so tracking rejection rates by category is a leading indicator of test noise.
Not every state can transition to every other state. Here's actual transition map.
Invalid transitions to enforce in your bug tracking tool:
Enforcing valid transitions in Jira workflows, Linear states, or GitHub Projects is what turns a state field into a real workflow. Without enforcement, states are labels people apply inconsistently.
These four states account for a big chunk of bug volume and they get treated as edge cases when they should have first-class workflows.
Cannot Reproduce
The reporter saw bug. The developer can't recreate it. Nobody knows what to do.
Common causes on mobile:
The wrong response: mark it Cannot Reproduce and close. The bug goes away from tracker but not from production.
The right response: request specific reproduction data (device model, OS version, app version, video), assign to reporter with a specific ask, and only close if no response within a defined window (typically 5 business days).
Not a Bug (works as designed)
The reporter thinks something is broken. The developer says it's working correctly per spec.
This is where product-QA misalignment surfaces. Half time, spec is genuinely wrong (or missing). The other half, tester misread requirements.
The workflow that works: developer justifies with a link to spec. QA and product both review justification. If everyone agrees it's not a bug, close. If not, escalate to product owner for a spec update.
Duplicate
Two different testers report same bug independently. Or same tester reports it twice.
Duplicates are more common than teams realize. They're also more useful than teams realize. A bug reported 5 times independently is a higher-severity bug than one reported once, even if severity classification stayed same.
The workflow that works: link duplicate to original, add reporter to original's watch list, close duplicate. Track duplicate rate as a signal for both bug severity (many dupes = widespread) and process efficiency (many dupes = search isn't working).
Deferred
The bug is valid. It's real. Nobody's fixing it right now.
Deferred is state that accumulates dead bugs. In an unhealthy backlog, "Deferred" is where bugs go to die. In a healthy one, Deferred has a date and an owner responsible for revisiting.
The rules that keep Deferred honest:
The generic defect life cycle assumes one runtime, one environment, one platform. Mobile violates all three.
Device-specific bugs
A bug affects Pixel 6 but not Pixel 8. Or Galaxy S22 but not Galaxy A54. The fix might work on one and break on other.
The life cycle needs to capture affected devices. Otherwise "Fixed" becomes "Fixed on dev's phone."
OS version-specific bugs
A bug affects iOS 15 but not iOS 17. Or Android 12 but not Android 14.
Fixing OS-specific bugs is complicated because sometimes you can't fix them - OS behavior changed and there's no workaround. That bug needs to move to Deferred with a note about OS support timeline rather than staying open forever.
Regression on OS updates
Apple releases iOS 18. Your app now behaves differently in a specific edge case. A bug that was working in iOS 17 is now broken in iOS 18.
This kind of bug doesn't come from your code changing. It comes from OS changing under your code. The life cycle needs to distinguish "regression from our change" from "regression from OS change" because debugging approach differs.
The verification device gap
Dev fixes bug on their iPhone 15 Pro. QA verifies on their iPhone SE 3rd gen. The bug appears fixed in both places.
But original report was on an iPhone 12 with iOS 16. That device wasn't tested. The bug might still be present there.
Mobile teams need explicit "verified on" tracking. "Fixed and verified" is meaningless without device and OS version list.
App version tracking
Bug reported on v3.4.1. Fix ships in v3.4.2. But users don't auto-update. Half userbase is still on v3.4.1 and still seeing bug.
The life cycle "Closed" state should track "closed at what version" and "% of users on that version or higher." Otherwise, closed bugs keep generating support tickets from users on old versions.
Mobile verification is genuinely harder than web verification. Here's pattern that keeps failing.
How verification breaks:
Every step is "correct" but net effect is a bug that stays in production.
The pattern that works:
This is more overhead than most teams want. Teams that skip it ship regressions users hit.
Total bug count is metric everyone tracks. It tells you almost nothing about life cycle health.
Cycle time
Total time from New to Closed. Median and P95. If cycle time is growing, process is slowing down somewhere.
Break this down into segments:
The slowest segment is where bottleneck lives.
Time-in-state (per state)
If most bugs sit in Ready for Verification for 3 days, your build pipeline is bottleneck. If most bugs sit in Assigned for 5 days before In Progress, your developer allocation is broken.
Reopen rate
Reopened bugs / Total closed bugs. Should be under 5% for a healthy team.
High reopen rate means:
Cannot Reproduce rate
Cannot Reproduce closures / Total closures. Should be under 10%.
High Cannot Reproduce rate means:
Duplicate rate
Duplicates / Total reported. High rate means testers can't find existing bugs (search issue) or same bug is genuinely widespread.
Aging
Bugs in each state longer than N days. Alert on:
Small teams can run a life cycle with 6 states in Google Sheets. Large teams can't. Here's what breaks and when.
Under 50 bugs/month:
50-500 bugs/month:
500-2000 bugs/month:
2000+ bugs/month:
The transitions between scales are painful. Teams that outgrow their tools ship regressions during transition period.
Different tools handle defect life cycle differently. Trade-offs:
Jira
Linear
GitHub Issues + Projects
Shortcut (formerly Clubhouse)
ClickUp / Monday.com
The right tool depends on team size and life cycle complexity, not on which is "best." A 6-person startup with Linear beats an enterprise with badly-configured Jira. Same team on Jira beats them on Linear if their workflow needs 12 states.
The Fixed → Verified transition is bottleneck for most teams. Verification is manual by default, and manual verification is slow.
Automated regression that reliably catches "specific bug is fixed AND nothing else broke" would collapse that transition from days to hours. Most mobile teams don't have this because selector-based test frameworks (Appium, XCUITest, Espresso) are too flaky to trust for verification.
The flakiness problem in verification:
Drizz tests are written in plain English:
Vision AI reads screen way a user does. The tests don't flake on selector changes, so a failure in verification actually means something failed.
Before, on Appium:
After, on Drizz:
The defect life cycle math works because Fixed → Verified segment shrinks by 75%. That flows through to cycle time, throughput, and how quickly production bugs get resolved.
The defect life cycle is only as fast as its slowest state. For most mobile teams, that's Fixed → Verified. Get framework right, and whole life cycle speeds up.
New, Triaged, Assigned, In Progress, Fixed, Ready for Verification, Verified, Closed, Reopened, Deferred, Duplicate, Rejected.
Nothing. They're used interchangeably. Some teams prefer "defect" because it sounds more formal. Others use "bug." Same process.
QA typically owns process. Product owns priority. Engineering owns fixes. Life cycle spans all three teams.
The bug can't be recreated by developer. Often a mobile-specific reproduction problem where devices, OS, or app versions differ.
Track cycle time, reopen rate under 5%, Cannot Reproduce rate under 10%, and aging alerts.
Yes, if bug resurfaces after fix ships. Reopened is a legitimate state signaling incomplete verification.