- Impact: We capture the effect of the defect on the user via this label. We sub-categorize it as:
- Corruption: persisted wrong data, data loss or a security bypass.
- Broken: a feature gives wrong or missing output, or stops working.
- Degraded: results stay correct but get worse, such as slower or noisier.
- Cosmetic: formatting, messages or listings.
- Reach: This label captures how many users will be affected by the defect. A defect on a commonly used setup is more detrimental than one on a setup used by a narrow user base. We sub-categorize it as:
- Broad: default settings or mainstream usage.
- Narrow: a specific niche setup; generally the defect surfaces when the user uses non-default flags.
- Rare: multiple unusual conditions need to be met for the defect path to be triggered.
- Failure mode: We also capture whether the user notices the defect when it happens:
- Silent: the code returns a wrong result, or an expected error never appears.
- Loud: the code raises an error the user sees.
Severity: It is a mixture of the above three, based on the rule defined in the table below:
| Impact \ Reach | Broad | Narrow | Rare |
| Corruption | critical | major | major |
| Broken | major | major if silent, else minor | minor |
| Degraded / cosmetic | minor | minor | minor |
- Difficulty: How much time a human developer would need to implement the change. It is sub-categorized into three types, shown for the task (PR1) and for the fix (PR2):
- Easy: under 15 minutes.
- Medium: 15 minutes to an hour.
- Hard: over an hour.
Time to fix: Days between PR1 and PR2: how long the defect stayed in the code before it was fixed.
Security: A separate tag for fixes that close an attack, such as injection or an authorization bypass. It does not change severity. PRs mined via CVE security advisories are flagged as security too.
An LLM judge assigns impact, reach, failure mode and difficulty for every instance. See the appendix of our paper for the prompts.