BugBot: Bugzilla triaging bot and alerting system
This page lists all the actions done by BugBot.
Introduction
Every day hundreds of tickets are opened in Bugzilla which track the tasks, defects and enhancements needed for the development of Firefox and other Mozilla projects. Triaging and prioritizing these bugs are an essential part of our development process and we automate part of this process so as to increase our development turn around and improve the quality of our bugs metadata. The set of tools we use to improve the quality of our bugs, decrease our triaging time and help Release Management ship better quality software is called BugBot (formerly known as Autonag).
Initially created as an alerting system (by email) to our triagers, BugBot rules now also make changes to our bugs metadata on Bugzilla so as to fix inconsistencies.
If you want the bot to not make changes to a specific bug, add [no-nag]
to its whiteboard field.
Active Rules
Rule 163: Variant Expiration
Purpose | Follow up on variants that need to be dropped or extended |
---|---|
Action | Create a bug before the variant becomes expired and follow up to extend or drop it |
Code | variant_expiration.py |
Detect spam bugs
Purpose | Automatically detect and handle spam bugs |
---|---|
Action | Close the bug as "INVALID" and move it to the "Invalid Bugs" product |
Code | spambug.py |
File bugs for new actionable crashes
Purpose | Automate discovering actionable crash reports to speed up fixes, reduce user impact, and save engineering time. |
---|---|
Action | Open a crash bug with the relevant information |
Code | file_crash_bug.py |
Wrong bug type
Purpose | Correct the bug type |
---|---|
Action | Check if the bug type is the same as predicted by bugbug, if it is different and the bot is confident, correct the type |
Code | defectenhancementtask.py |
Enhancement or task with the "regression", "crash" or "assertion" keyword
Purpose | Correct the bug type |
---|---|
Action | Change the bug type to "defect" |
Code | regression_but_type_enhancement_task.py |
Closed bugs with dupeme keyword
Purpose | Clean up the metadata |
---|---|
Action | Remove the dupeme keyword |
Code | closed_dupeme.py |
Bugs with dupeme in the whiteboard instead of keyword
Purpose | Clean up the metadata |
---|---|
Action | Replace the '[dupeme]' whiteboard tag with the 'dupeme' keyword |
Code | dupeme_whiteboard_keyword.py |
Bugs with no 'Has STR' and STR in the first comment
Purpose | Compleat missing metadata |
---|---|
Action | Set the 'Has STR' field to be 'yes' |
Code | has_str_no_hasstr.py |
Copy metadata from duplicates
Purpose | Increase the visibility of important information after closing a bug as a duplicate |
---|---|
Action | Copy missed metadata from duplicate bugs |
Code | duplicate_copy_metadata.py |
Bugs with small crash volume
Purpose | Identify topcrash or high severity bugs that started getting small crash volume |
---|---|
Action | Remove the topcrash keywords and decrease the bug severity if the crash volume is very low |
Code | crash_small_volume.py |
Bugs with higher severity duplicates
Purpose | Highlight inconsistency in the severity between a bug and its duplicates |
---|---|
Action | Needinfo the assignee and fallback to the triage owner if a duplicate bug has a higher severity value |
Code | severity_higher_dups.py |
Regression on nightly
Purpose | Increase the visibility of regression bugs |
---|---|
Action | Set nightly status flag to affected on newly filed regression bugs |
Code | regression_new_set_nightly_affected.py |
Remove leave-open
keyword on closed bug
Purpose | Clean up a mismatch in metadata |
---|---|
Action | If a bug is closed but the leave-open keyword is still set, remove it |
Example | Bug 1382185 |
Code | leave_open.py |
[meta] in title but not in keywords
Purpose | Improve metedata quality |
---|---|
Action | Adds the meta keyword if the bug title starts by [META] |
Example | Bug 1435799 |
Code | meta_summary_missing.py |
Update Firefox Status flags for bugs reopened during Nightly cycle
Purpose | Avoids potential issues for sheriffs and release managers |
---|---|
Action | Set firefox-status flag back from fixed to affected |
Example | Bug 1495962 |
Code | nightly_reopened.py |
Bug with no assignee but a patch landed
Purpose | Attribute unassigned bug to the developer that fixed it |
---|---|
Action | The ASSIGNEE field on the bug is changed from nobody@mozilla.org to the author of the patch that landed in mozilla-central |
Example | Bug 1514338 |
Code | no_assignee.py |
Close crash bugs with no crashes over 12 weeks
Purpose | Reduce the backlog of bugs to check for Release Managers |
---|---|
Action | Crash bugs without any crash reports for more than 12 weeks |
Example | Bug 1470864 |
Code | no_crashes.py |
Remove stalled
keyword on closed bugs
Purpose | Fix inconsistency between metadata and bug status |
---|---|
Action | If a bug is marked as FIXED and also has a stalled keyword set, the keyword is removed |
Example | Bug 1491624 |
Code | stalled.py |
Has meta keyword but not [meta] in the bug title
Purpose | Having [meta] in the bug title helps with quick search results |
---|---|
Action | If a bug has the meta keyword set, [meta] is added to the bug title |
Example | Bug 1257692 |
Code | summary_meta_missing.py |
Set a Firefox status flag for beta if there is one for nightly and release
Purpose | Fix inconsistency in Firefox status flags that can lead to a bug going undetected by Release Managers during the beta cycle |
---|---|
Action | If a status exists for Firefox N-1 and for Firefox N+1, guess a value for Firefox N |
Example | Bug 1500273 |
Code | missing_beta_status.py |
Add regression
keywords to bugs (uses Machine Learning)
Purpose | Surface regressions not filed as such |
---|---|
Action | If a bug is tracked by a Release Manager, update the priority (P2 for nightly, P1 for the rest) |
Example | Bug 1529139 |
Code | regression.py |
Move untriaged bug into the correct component (uses machine learning)
Purpose | Decrease manual triage time |
---|---|
Action | Uses machine learning to mass move bugs in Firefox::Untriaged into a better component |
Example | Bug 1530316 |
Code | component.py |
Copy crash signature from duplicate bugs to main bugs
Purpose | Crash bugs marked as duplicate of another one may have a different crash signature. We need to consolidate all signatures in the bug where a patch to fix them is being worked on, other wise we may not fix them all |
---|---|
Action | If a crash bug is marked as a duplicate, the signatures it referenced are added to the new bug |
Example | Bug 1517205 |
Code | copy_duplicate_info.py |
Update release status flags based on info from the regressing bug
Purpose | Automate setting the release status flags |
---|---|
Action | Set release status flags to "affected" or "unaffected" based on the status flags in the regressing bug |
Code | regression_set_status_flags.py |
Needinfo triage owner to set severity on bugs
Purpose | Every defect should have a severity set. Also bugs with no severity set are harder to prioritize for Release Managers with regards to the release (see what-do-you-triage) |
---|---|
Action | The triage owner is needinfoed in Bugzilla to set a severity on bugs |
Code | workflow/no_severity_ni.py |
Nag triage owner to set severity on bugs
Purpose | Every defect should have a severity set. Also bugs with no severity set are harder to prioritize for Release Managers with regards to the release (see what-do-you-triage) |
---|---|
Action | The triage owner is nagged via email to set a severity on bugs |
Code | workflow/no_severity_nag.py |
Nag triage owner on P1 bugs with no activity
Purpose | Since P1 means that the bug should be fixed for the next release (see what-do-you-triage), the bug needs to show any progress in its resolution (or maybe the priority should be decreased) |
---|---|
Action | The triage owner is nagged via email to have a reminder |
Example | Bug 1507251 |
Code | workflow/p1_no_activity.py |
Nag triage owner to find an assignee for P1 bugs with no assignee and no activity
Purpose | Since P1 means that the bug should be fixed for the next release (see what-do-you-triage), the bug urgently needs to have an assignee (or the priority should be decreased) |
---|---|
Action | The triage owner is needinfoed in Bugzilla or nagged via email to find an assignee on bugs |
Example | Bug 1541291 |
Code | workflow/p1_no_assignee.py |
Change the priority from P2 to P1 on assigned bug the merge day
Purpose | Since P2 means that the bug should be fixed for the next release (see what-do-you-triage), when we are the merge day then this bug automatically becomes a P1. |
---|---|
Action | Update the priority to P1 and add a comment to explain. |
Code | workflow/p2_merge_day.py |
Patch not landed
Purpose | Identify bugs with an unlanded r+ patch. Maybe the patch is now obsolete or the bug needs to have a sheriff land the code with the checkin-needed keyword set. |
---|---|
Action | The bug assignee is needinfoed in Bugzilla to ask her/him to have a look |
Example | Bug 1496844 |
Code | not_landed.py |
Regression without regressed_by and some bug dependencies
Purpose | Identify regressions which have dependencies (blocks or depends_on) and an empty regressed_by, probably people forgot to use the new field. |
---|---|
Action | The bug assignee or the person who added some dependencies or the reporter is needinfoed to ask to fill regressed_by when it's possible. |
Example | Bug 1545797 |
Code | regression_without_regressed_by.py |
Product::Component changed after the priority has been set
Purpose | Identify bugs where Product::Component changed after the priority has been set. The priority is probably no more up-to-date and so triage owner needs to set it. |
---|---|
Action | Reset the priority to "--" with a comment explaining why the bot is doing that. |
Example | Bug 1546366 |
Code | prod_comp_changed_with_priority.py |
Close intermittent test failure bugs
Purpose | Close intermittent test failure bugs which are P5s, not marked leave-open , and have not had a new failure in 21 days. |
---|---|
Action | RESOLVE bug as INCOMPLETE with a comment explaining why the bot is doing this. |
Example | Bug 1577895 |
Code | close_intermittents.py |
Ask for a beta uplift request
Purpose | Identify bugs where a patch fixed a bug in nightly and beta is marked as affected. |
---|---|
Action | Needinfo the assignee to ask it's worth making an uplift request. |
Example | Bug 1620434 |
Code | uplift_beta.py |
Bisection without regressed_by
Purpose | Identify bugs which contain a bisection made by mozregression or fuzzing tools and an empty regressed_by, probably people forgot to set the field. |
---|---|
Action | The bug assignee or the regression author is needinfoed to ask to fill regressed_by when it's possible. |
Example | Bug 1683535 |
Code | bisection_without_regressed_by.py |
Unassign inactive bugs with the good-first-bug keyword
Purpose | Identify inactive good first bugs, to free them up for other contributors. |
---|---|
Action | Reset the assignee and status fields and post a comment. |
Code | good_first_bug_unassign_inactive.py |
Bugs with needinfo requests on inactive people
Purpose | Identify bugs that have pending needinfo on inactive users. |
---|---|
Action | Depending on the bug, redirect the needinfo to the triage owner, cancel the needinfo, or close the bug. |
Code | inactive_ni_pending.py |
Highlight topcrash bugs
Purpose | Identify topcrash bugs that are missing topcrash keywords or have low severity |
---|---|
Action | Add the missing keywords and needinfo to suggest increasing severity in case of a low severity |
Code | topcrash_highlight.py |
Approve tracking request for expiring telemetry
Purpose | Save time and eliminate unnecessary manual work |
---|---|
Action | Automatically approve tracking requests for bugs created by telemetry-probes@mozilla.bugs |
Code | telemetry_expiry_tracking_autoapproval.py |
Feature vs regression
Purpose | Fix inconsistency in bugs with both the regression and feature keywords set |
---|---|
Action | No action yet |
Code | feature_regression.py |
Inactive bugs with the leave-open
keyword set
Purpose | Help identify dead/inactive bugs |
---|---|
Action | Needinfo the triage owner if a bug is inactive but has the leave-open keyword set |
Example | Bug 1367072 |
Code | leave_open_no_activity.py |
Inactive Meta bugs
Purpose | Help identify dead/inactive bugs |
---|---|
Action | Needinfo the triage owner if a meta bug has no activity and no dependencies set |
Code | meta_no_deps_no_activity.py |
Alert for lack of feedback in a bug
Purpose | Increase reaction time on bugs prioritized by upper management or release managers |
---|---|
Action | If a bug has an unanswered needinfo request from a release manager or a director, send a warning email |
Code | ni_from_manager.py |
Bugs with only one or two words in the summary
Purpose | Make sure the bug is actually useful, a two-words summary often indicates a poor quality bug report |
---|---|
Action | No action yet |
Example | Bug 1512823 |
Code | one_two_word_summary.py |
Reporter not answering to Needinfo request
Purpose | Identify bugs stalled because we need more information from the reporter to reproduce it |
---|---|
Action | No action yet |
Code | reporter_with_ni.py |
Identify tracked bugs with a NeedInfo request
Purpose | Make sure that bugs tracked for a release or nominated for tracking which also have a NeedInfo request do not get stuck |
---|---|
Action | Send an email |
Code | tracked_needinfo.py |
Tracked bugs untouched for a week
Purpose | Identify important bugs for a release which are not being acted upon |
---|---|
Action | Send an email |
Code | tracking.py |
Identify unlanded uplifts to Beta and ESR
Purpose | Make sure that we ship with the bugs that we need |
---|---|
Action | Send an email wih the list of bugs with uplift requests not landed on the affected branch |
Example | Bug 1509394 |
Code | unlanded.py |
Bugs with high severity in Firefox::Untriaged
Purpose | Identify potentially important issues left untriaged |
---|---|
Action | No action yet |
Code | untriage_important_sev.py |
Information about bugs landed during Soft Code Freeze
Purpose | List fixed bug with patches which landed in mozilla-central during the soft freeze week. The listing includes patch statistics. |
---|---|
Action | Send an email |
Code | code_freeze_week.py |
Hightlight Fixed bugs in nightly we may want to uplift
Purpose | Identify potentially upliftable bugs. |
---|---|
Action | Send an email with the recent fixes, the affected branches and metadata for prioritization |
Code | missed_uplifts.py |
New user with a Needinfo request
Purpose | Help identify potentially unactionable bugs per lack of information |
---|---|
Action | Send an email |
Code | newbie_with_ni.py |
Assignee is inactive
Purpose | Help identify bugs that are assigned to inactive accounts |
---|---|
Action | Reset the assignee, and if the bug has high priority or high severity, needinfo the triage owner |
Code | assignee_no_login.py |
Bugs with inconsistent severity flags
Purpose | Make sure that bugs severity is consistent with the accessibility severity on the Whiteboard |
---|---|
Action | Needinfo the assignee or the triage owner if not assigned yet |
Code | severity_inconsistency.py |
Regression bugs where the regressor author is not involved
Purpose | Highlight regressions to people who caused them |
---|---|
Action | Needinfo the assignee of the bug that caused the regression |
Code | needinfo_regression_author.py |
Bugs with high security keywords which are set to low severity
Purpose | Identify bugs whose severity field is set to S3 or S4 and at the same time have sec-high or sec-critical keywords |
---|---|
Action | Needinfo to propose increasing the severity |
Code | severity_high_security.py |
Bugs with P1 WebCompat priority and severity set to low
Purpose | Consistency and getting traction on important web compatibility bugs |
---|---|
Action | Needinfo the assignee or the triage owner if not assigned yet |
Code | severity_high_compat_priority.py |
Automatically confirm bugs that have an affected Firefox version flag
Purpose | Fix inconsistency in the status of unconfirmed bugs |
---|---|
Action | Confirm bugs with affected Firefox version flags by changing the status to "NEW" |
Code | affected_flag_confirm.py |
Automatically confirm bugs that have a crash signature
Purpose | Fix inconsistency in the status of unconfirmed bugs |
---|---|
Action | Confirm bugs with crash signatures by changing the status to "NEW" |
Code | crash_signature_confirm.py |
Bugs with patches after being closed
Purpose | Identify bugs that receive patches after being closed |
---|---|
Action | Comment on the bug and email release managers |
Code | patch_closed_bug.py |
Bugs with underestimated severity levels
Purpose | Identify bugs whose severity could be underestimated |
---|---|
Action | Needinfo the assignee or the triage owner if not assigned yet |
Code | severity_underestimated.py |
Components with triage owner need to be assigned
Purpose | Identify components whose triage owners are unassigned, disabled, or inactive |
---|---|
Action | Nag managers to assign triage owners |
Code | vacant_triage_owner.py |
Tracked bugs that need attention
Purpose | Notify about tracked bugs with no assignee, low severity, or low priority |
---|---|
Action | Needinfo the team manager and fallback on the triage owner if we have no team manager defined in our config |
Code | tracked_attention.py |
Bugs with inactive patch reviewers
Purpose | Unblock bugs by identifying patches that are waiting for review from or unavailable reviewers |
---|---|
Action | Needinfo patch authors to find active reviewers |
Code | inactive_reviewer.py |
Fuzz blocker bugs
Purpose | Bring attention to bugs that prevent fuzzing from making progress |
---|---|
Action | Send weekly reminder emails and suggest increasing the severity when it is low. |
Code | fuzz_blockers.py |
Severity of performance impacting bugs
Purpose | Consistency and help getting traction on bugs with a high impact on performance |
---|---|
Action | Needinfo the assignee or the triage owner (if not assigned) to increase the severity |
Code | severity_high_performance_impact.py |
Bugs with a high number of recent regressions
Purpose | Highlight bugs that introduce a high number of regressions |
---|---|
Action | Notify release managers |
Code | warn_regressed_by.py |
Bugs with whiteboard reminders
Purpose | Remind about future tasks |
---|---|
Action | Post a reminder on the bug and remove the reminder whiteboard tag |
Code | reminder.py |
Bugs to triage
Purpose | Highlight defect bugs that need to be triaged |
---|---|
Action | Notify the triage owner |
Code | to_triage.py |
Bugs moved to Core::Performance
Purpose | Make sure the bug has the basic information needed for performance bugs. |
---|---|
Action | Add a needinfo request when a bug is moved to Core::Performance to ask for missed information. |
Code | moved_to_performance.py |
Uh-hide duplicate security bugs
Purpose | Publish security bugs that are already fixed and safe to be public. |
---|---|
Action | Send emails to people in the security team to highlight security bugs which are duplicates of already-public bugs. |
Code | security_unhide_dups.py |
Label WebCompat platform bugs
Purpose | Ensure core bugs blocking webcompat knowledge base entries have webcompat:platform-bug keyword. |
---|---|
Action | Add webcompat:platform-bug keyword where it's missing |
Code | webcompat_platform_without_keyword.py |
Inactive performance regressions
Purpose | Ensure progress continues on resolving performance regressions. |
---|---|
Action | Needinfo author of regressor after a period of inactivity. |
Code | perfalert_inactive_regression.py |
Removed Rules
Fuzzing bisection without regressed_by
Purpose | Identify bugs which contain a bisection made by fuzzing tools and an empty regressed_by, probably people forgot to set the field. |
---|---|
Action | The bug assignee is needinfoed to ask to fill regressed_by when it's possible. |
Example | Bug 1683535 |
Note | Replaced with Bisection without regressed_by |
Bugs with top-crash signatures
Purpose | Identify bugs that are missing topcrash or topcrash-startup keywords |
---|---|
Action | Add the missing keyword and needinfo to suggest increasing severity in case of a low severity |
Note | Replaced with Highlight topcrash bugs |
Top crashers with low severity
Purpose | Consistency and help getting traction on top-crash bugs |
---|---|
Action | Needinfo the assignee or the triage owner if not assigned yet |
Example | Bug 1471692 |
Note | Replaced with Highlight topcrash bugs |
Low severity bugs with tracking status
Purpose | Suggest increasing the severity for bugs that are marked as blocking or are tracked for nightly, beta, or release |
---|---|
Action | Needinfo the assignee or the triage owner if not assigned yet |
Note | Dropped in favor of Tracked bugs that need attention |
Increase severity of bugs tracked by Release Managers
Purpose | Fix inconsistency in metadata |
---|---|
Action | If a bug is tracked for an upcoming release but it's severity field is low, the severity is increased |
Example | Bug 1538966 |
Note | Dropped in favor of Tracked bugs that need attention |
Bugs with STR and no regression range
Purpose | Compleat missing metadata |
---|---|
Action | Needinfo the bug creator to find the regression range |
Note | Removed on 2024-02-13 |
Nag triage owner to set severity on bugs
Purpose | Every defect should have a severity set. Also bugs with no severity set are harder to prioritize for Release Managers with regards to the release (see what-do-you-triage) |
---|---|
Action | The triage owner is needinfoed in Bugzilla or nagged via email to set a severity on bugs |
Note | Split into two rules: Needinfo triage owner to set severity on bugs and Nag triage owner to set severity on bugs |
Contents
- 1 Introduction
- 2 Active Rules
- 2.1 Rule 163: Variant Expiration
- 2.2 Detect spam bugs
- 2.3 File bugs for new actionable crashes
- 2.4 Wrong bug type
- 2.5 Enhancement or task with the "regression", "crash" or "assertion" keyword
- 2.6 Closed bugs with dupeme keyword
- 2.7 Bugs with dupeme in the whiteboard instead of keyword
- 2.8 Bugs with no 'Has STR' and STR in the first comment
- 2.9 Copy metadata from duplicates
- 2.10 Bugs with small crash volume
- 2.11 Bugs with higher severity duplicates
- 2.12 Regression on nightly
- 2.13 Remove leave-open keyword on closed bug
- 2.14 [meta] in title but not in keywords
- 2.15 Update Firefox Status flags for bugs reopened during Nightly cycle
- 2.16 Bug with no assignee but a patch landed
- 2.17 Close crash bugs with no crashes over 12 weeks
- 2.18 Remove stalled keyword on closed bugs
- 2.19 Has meta keyword but not [meta] in the bug title
- 2.20 Set a Firefox status flag for beta if there is one for nightly and release
- 2.21 Add regression keywords to bugs (uses Machine Learning)
- 2.22 Move untriaged bug into the correct component (uses machine learning)
- 2.23 Copy crash signature from duplicate bugs to main bugs
- 2.24 Update release status flags based on info from the regressing bug
- 2.25 Needinfo triage owner to set severity on bugs
- 2.26 Nag triage owner to set severity on bugs
- 2.27 Nag triage owner on P1 bugs with no activity
- 2.28 Nag triage owner to find an assignee for P1 bugs with no assignee and no activity
- 2.29 Change the priority from P2 to P1 on assigned bug the merge day
- 2.30 Patch not landed
- 2.31 Regression without regressed_by and some bug dependencies
- 2.32 Product::Component changed after the priority has been set
- 2.33 Close intermittent test failure bugs
- 2.34 Ask for a beta uplift request
- 2.35 Bisection without regressed_by
- 2.36 Unassign inactive bugs with the good-first-bug keyword
- 2.37 Bugs with needinfo requests on inactive people
- 2.38 Highlight topcrash bugs
- 2.39 Approve tracking request for expiring telemetry
- 2.40 Feature vs regression
- 2.41 Inactive bugs with the leave-open keyword set
- 2.42 Inactive Meta bugs
- 2.43 Alert for lack of feedback in a bug
- 2.44 Bugs with only one or two words in the summary
- 2.45 Reporter not answering to Needinfo request
- 2.46 Identify tracked bugs with a NeedInfo request
- 2.47 Tracked bugs untouched for a week
- 2.48 Identify unlanded uplifts to Beta and ESR
- 2.49 Bugs with high severity in Firefox::Untriaged
- 2.50 Information about bugs landed during Soft Code Freeze
- 2.51 Hightlight Fixed bugs in nightly we may want to uplift
- 2.52 New user with a Needinfo request
- 2.53 Assignee is inactive
- 2.54 Bugs with inconsistent severity flags
- 2.55 Regression bugs where the regressor author is not involved
- 2.56 Bugs with high security keywords which are set to low severity
- 2.57 Bugs with P1 WebCompat priority and severity set to low
- 2.58 Automatically confirm bugs that have an affected Firefox version flag
- 2.59 Automatically confirm bugs that have a crash signature
- 2.60 Bugs with patches after being closed
- 2.61 Bugs with underestimated severity levels
- 2.62 Components with triage owner need to be assigned
- 2.63 Tracked bugs that need attention
- 2.64 Bugs with inactive patch reviewers
- 2.65 Fuzz blocker bugs
- 2.66 Severity of performance impacting bugs
- 2.67 Bugs with a high number of recent regressions
- 2.68 Bugs with whiteboard reminders
- 2.69 Bugs to triage
- 2.70 Bugs moved to Core::Performance
- 2.71 Uh-hide duplicate security bugs
- 2.72 Label WebCompat platform bugs
- 2.73 Inactive performance regressions
- 3 Removed Rules
- 3.1 Fuzzing bisection without regressed_by
- 3.2 Bugs with top-crash signatures
- 3.3 Top crashers with low severity
- 3.4 Low severity bugs with tracking status
- 3.5 Increase severity of bugs tracked by Release Managers
- 3.6 Bugs with STR and no regression range
- 3.7 Nag triage owner to set severity on bugs