Independently infer and apply group and stage labels
Proposal
- The bot does doesn't change a stage or group label if it's already set.
- A group label is chosen only if the highest group match from its category labels is > 50%.
- A group label is chosen only if the it matches the already set stage label (if applicable).
- A stage label is set based on the chosen or already set group label.
- The bot leaves a message that explains its inference logic.
Triage workflow
graph LR
A{Stage label is present?} -- Yes --> B
B{Group label is present?} -- Yes --> X1[Nothing to do.]
B -- No --> E
E{Group is detected based on category labels<br>with a match rate > 50% among all category labels?} -- Yes --> H
E -- No --> K
H{Does detected group label matches stage label?} -- Yes --> X2[Set detected group label.]
H -- No --> K
K{Several potential groups in current<br>stage detected from category labels?} -- Yes --> X3[Manual triage required.]
K -- No --> X4[Set default group label based on stage label.]
A -- No --> C
C{Group label is present?} -- Yes --> X5[Set stage label based on group label, we're done!]
C -- No --> G
G{Group is detected based on feature/category labels?} -- Yes --> X6[Set group and stage labels.]
G -- No --> X7[Manual triage required.]
Use-cases/test-cases
| Stage label | Group label | Category labels | Team label | New labels | Bot message | Note |
|---|---|---|---|---|---|---|
| ~"devops::configure" | ~"group::autodevops and kubernetes" | ~"wiki" | ~"Verify" | No new labels. | ||
| ~"devops::configure" | ~"group::autodevops and kubernetes" | ~"wiki" | No new labels. | |||
| ~"devops::configure" | ~"group::autodevops and kubernetes" | ~"Verify" | No new labels. | |||
| ~"devops::configure" | ~"group::autodevops and kubernetes" | No new labels. | ||||
| devopscreate | ~"wiki" (100% matching stage) | ~"Verify" | groupknowledge | Setting ~"group::knowledge" based on ~"wiki". |
Group based on category since category matches stage | |
| devopscreate | ~"wiki" (100% matching stage) | groupknowledge | Setting ~"group::knowledge" based on ~"wiki". |
Group based on category since category matches stage | ||
| devopscreate | ~"wiki" ~elasticsearch (100% matching stage, 2 different groups) | ~"Verify" | groupknowledge | Manual triage required since the 2 potential groups are conflicting | ||
| devopscreate | ~"wiki" ~elasticsearch (100% matching stage, 2 different groups) | groupknowledge | Manual triage required since the 2 potential groups are conflicting | |||
| devopscreate | ~"wiki" ~"design management" analytics (66% matching stage) | ~"Verify" | groupknowledge | Setting ~"group::knowledge" based on ~"design management" ~"wiki". |
Group based on category since category matches stage | |
| devopscreate | ~"wiki" ~"design management" analytics (66% matching stage) | groupknowledge | Setting ~"group::knowledge" based on ~"design management" ~"wiki". |
Group based on category since category matches stage | ||
| devopscreate | ~"wiki" analytics (50% matching stage) | ~"Verify" | groupknowledge | Setting ~"group::knowledge" based on ~"wiki". |
Group based on category since category matches stage | |
| devopscreate | ~"wiki" analytics (50% matching stage) | groupknowledge | Setting ~"group::knowledge" based on ~"wiki". |
Group based on category since category matches stage | ||
| devopscreate | ~"wiki" analytics epics (33% matching stage) | ~"Verify" | groupknowledge | Setting ~"group::knowledge" based on ~"wiki". |
Group based on category since category matches stage | |
| devopscreate | ~"wiki" analytics epics (33% matching stage) | groupknowledge | Setting ~"group::knowledge" based on ~"wiki". |
Group based on category since category matches stage | ||
| devopspackage | ~"design management" (none matching stage) | ~"Verify" | ~"group::package" | Setting ~"group::package" based on ~"devops::package". |
Group based on stage since category does not match stage | |
| devopspackage | ~"design management" (none matching stage) | ~"group::package" | Setting ~"group::package" based on ~"devops::package". |
Group based on stage since category does not match stage | ||
| ~"devops::configure" | ~"Gitaly" | ~"group::autodevops and kubernetes" | Setting ~"group::autodevops and kubernetes" based on ~"devops::configure". |
Group based on stage | ||
| devopsverify | ~"group::ci and runner" | Setting ~"group::ci and runner" based on ~"devops::verify". |
Default group from stage | |||
| groupsource code | ~"design management" markdown | ~"Verify" | devopscreate | Setting ~"devops::create" based on ~"group::source code". |
Stage based on group | |
| groupsource code | ~"design management" markdown | devopscreate | Setting ~"devops::create" based on ~"group::source code". |
Stage based on group | ||
| ~"group::memory" | ~"Gitaly" | ~"devops::enablement" | Setting ~"devops::enablement" based on ~"group::memory". |
Stage label based on group | ||
| ~"group::memory" | ~"devops::enablement" | Setting ~"devops::enablement" based on ~"group::memory". |
Stage label based on group | |||
| backend ~"bug" | ~"Plan" | devopsplan ~"group::team planning" | Setting ~"devops::plan" and ~"group::team planning" based on ~"Plan". |
Stage and group based on team | ||
| ~"bug" rake tasks | Manual triage required | |||||
| ~"internationalization" (best match: 100%) | ~"Verify" | devopsmanage ~"group::measure" | Setting ~"devops::manage" and ~"group::measure" based on ~"internationalization". |
Stage and group based on category | ||
| ~"internationalization" (best match: 100%) | devopsmanage ~"group::measure" | Setting ~"devops::manage" and ~"group::measure" based on ~"internationalization". |
Stage and group based on category | |||
| snippets ~"elasticsearch" ~"internationalization" (best match: 66%) | ~"Verify" | devopscreate ~"group::editor" | Setting ~"devops::create" and ~"group::editor" based on ~"elasticsearch" ~"snippets". |
Stage and group based on category label | ||
| snippets ~"elasticsearch" ~"internationalization" (best match: 66%) | devopscreate ~"group::editor" | Setting ~"devops::create" and ~"group::editor" based on ~"elasticsearch" ~"snippets". |
Stage and group based on category label | |||
| ~"elasticsearch" ~"internationalization" (best match: 50%) | ~"Verify" | devopsverify ~"group::ci and runner" | Setting ~"devops::verify" and ~"group::ci and runner" based on ~"Verify". |
Stage and group based on team | ||
| ~"elasticsearch" ~"internationalization" (best match: 50%) | Manual triage required | |||||
| pipeline ~"elasticsearch" ~"internationalization" (best match: 33%) | ~"Verify" | devopsverify ~"group::ci and runner" | Setting ~"devops::verify" and ~"group::ci and runner" based on ~"Verify" |
Stage and group based on team | ||
| pipeline ~"elasticsearch" ~"internationalization" (best match: 33%) | Manual triage required | |||||
| ~"backstage" (no match) | ~"Verify" | devopsverify ~"group::ci and runner" | Setting ~"devops::verify" and ~"group::ci and runner" based on ~"Verify" |
Stage and group based on team | ||
| ~"backstage" (no match) | Manual triage required |
Edited by Rémy Coutable