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