# Triage Priorities for Dart Analyzer

This document describes the relative priorities for bugs filed under the
`area-analyzer` tag in GitHub as in
[this search](https://github.com/dart-lang/sdk/issues?q=is%3Aopen+is%3Aissue+label%3Aarea-analyzer).
While there are always exceptions to any rule, in general try to align our
priorities with these definitions.

To triage bugs, search for `area-analyzer`
[bugs that are not currently triaged](https://github.com/dart-lang/sdk/issues?q=is%3Aopen+is%3Aissue+label%3Aarea-analyzer+-label%3AP0+-label%3AP1+-label%3AP2+-label%3AP3+-label%3AP4)
and for each bug, mark priority based on how closely it matches with the below
constraints.

## Analyzer triage priorities

Descriptions here use [terms and definitions](#terms-and-definitions) from the
end of this document.  If your bug doesn't precisely match one of these,
consider how impactful it is compared to examples given here and pick a priority
reflecting that.

### P0

* Incorrect analysis errors or warnings, widespread
* Uncaught exceptions resulting in tool crashes, widespread and no workaround
* Incorrect resolution of symbols or libraries, widespread and no workaround
* Incorrect data from analyzer API, widespread and with no workaround
* Automation resulting in corrupted code from clean inputs, widespread
* Performance regression, large and widespread
* Any problem urgently blocking critical milestones for key users or Dart rolls
  into Flutter/Google3
* Security or privacy problem, widespread

### P1

* Incorrect analysis errors or warnings, on edge cases but no workarounds
* Incorrect analysis infos, widespread
* Incorrect resolution of symbols or libraries, edge cases, or widespread but
  with workaround
* Incorrect data from analyzer API, widespread but with workaround
* Uncaught exceptions resulting in tool crashes, widespread but with workaround
* Automation resulting in corrupted code from clean inputs, edge cases or with
  an easy workaround
* Automation resulting in incorrect code, widespread
* Performance regression, large or widespread (but not both), or impacting key
  users
* An enhancement required for critical milestones for key users, or that has
  significant evidence gathered indicating a positive impact if implemented
* Any problem that, while it doesn't currently block, will block rolls into
  Flutter/Google3 if not resolved within ~2 weeks
* Security or privacy problem, in edge cases or with very simple workarounds

### P2

* Incorrect analysis errors or warnings, on edge cases with simple workaround
* Incorrect analysis infos, on edge cases
* Incorrect resolution of symbols or libraries, edge cases only with workarounds
* Incorrect data from analyzer API, edge cases without workaround
* Automation resulting in incorrect code, edge cases
* Uncaught exceptions resulting in tool crashes, edge cases
* Performance regression, large,  impacting edge cases, without good workarounds
* Security or privacy problem, theoretical & non-exploitable
* An enhancement that the team agrees is a good idea but without strong evidence
  indicating positive impact

### P3

* Uncaught exceptions caught by a fuzzer, but believed to be theoretical
  situations only
* Incorrect analysis errors or warnings, theoretical
* Incorrect analysis infos, on edge cases with workaround
* Incorrect resolution of symbols or libraries, theoretical
* Incorrect data from analyzer API, edge case with workaround available
* Performance regression impacting edge cases with workaround or without
  workaround if small
* Automation resulting in incorrect code, theoretical or edge cases with easy
  workaround
* An enhancement that someone on the team thinks might be good but it isn't
  (yet?) generally agreed by those working in the area that it is good

### P4

* Incorrect analysis infos, theoretical
* Incorrect data from analyzer API, theoretical
* Theoretical performance problems
* An enhancement that may have some evidence that it isn't a good idea to
  implement but it isn't clear enough to close

## Terms and definitions

### Terms describing impact

* "edge cases" - Impacting only small parts of the ecosystem.  For example,
  one package, or one key user with a workaround.  Note this is an edge case
  from the perspective of the ecosystem vs. language definition.  If it isn't
  happening much in the wild or (if there isn't evidence either way) if it
  isn't believed to be super likely in the wild, it is an edge case.
* "theoretical" - Something that we think is unlikely to happen in the wild
  and there's no evidence for it happening in the wild.
* "widespread" - Impact endemic throughout the ecosystem, or at least far
  enough that this is impacting multiple key users.

### Other terms

* "automation" - Anything that changes the user's code automatically.
  Autocompletion, quick fixing, NNBD migration, etc.
* "corrupted code" - Modification of source code in such a way that it is
  more than just a bit wrong or having some symbols that don't exist, but is
  not valid Dart and would be painful to manually correct.
* "incorrect code" - Modification of code in a way that is known to be wrong,
  but would be trivial to figure out how to fix for the human using the tool.
* "key users" - Flutter, Pub, Fuchsia, Dart, Google3, 1P
* "tool" - Analysis Server, dartanalyzer, migration tool, analyzer-as-library
