From e3b32ecac11fc807b4eabc038254eec92a0530f6 Mon Sep 17 00:00:00 2001 From: Jeremy Herve Date: Wed, 15 Jan 2025 12:21:08 +0100 Subject: [PATCH] Priority indicators: update logic to match new priority matrix (#40672) * Priority indicators: update logic to match new priority matrix We now ask different questions in our issue templates: https://github.com/Automattic/jetpack/pull/40501 This commit updates the logic to match the new questions and answers. It also captures the optional extra information ("other impact(s)") an issue can have, since that info can bump the severity, and in turn the priority, of an issue. See pfVjQF-su-p2 * Update impact wording See https://github.com/Automattic/wp-calypso/pull/97049#issuecomment-2552873786 * Be more explicity in final logged priority message See https://github.com/Automattic/jetpack/pull/40672#discussion_r1892788417 * Support multiple potential extra details that can bump pri See https://github.com/Automattic/jetpack/pull/40672#discussion_r1892775604 --- .../update-repo-gardening-priority-indicators | 4 + .../src/utils/parse-content/find-priority.js | 75 +++++++++++++++---- 2 files changed, 64 insertions(+), 15 deletions(-) create mode 100644 projects/github-actions/repo-gardening/changelog/update-repo-gardening-priority-indicators diff --git a/projects/github-actions/repo-gardening/changelog/update-repo-gardening-priority-indicators b/projects/github-actions/repo-gardening/changelog/update-repo-gardening-priority-indicators new file mode 100644 index 0000000000000..bdaf44b56c165 --- /dev/null +++ b/projects/github-actions/repo-gardening/changelog/update-repo-gardening-priority-indicators @@ -0,0 +1,4 @@ +Significance: major +Type: changed + +Issue triage: update priority matrix. diff --git a/projects/github-actions/repo-gardening/src/utils/parse-content/find-priority.js b/projects/github-actions/repo-gardening/src/utils/parse-content/find-priority.js index 137effa04b940..36b7865bdadec 100644 --- a/projects/github-actions/repo-gardening/src/utils/parse-content/find-priority.js +++ b/projects/github-actions/repo-gardening/src/utils/parse-content/find-priority.js @@ -2,37 +2,82 @@ const debug = require( '../debug' ); /** * Figure out the priority of the issue, based off issue contents. - * Logic follows this priority matrix: pciE2j-oG-p2 + * Logic follows this priority matrix: pfVjQF-su-p2 * * @param {string} body - The issue content. * @return {string} Priority of issue. */ function findPriority( body ) { + let priority = 'TBD'; + + debug( `find-priority: Looking for priority indicators in issue body: ${ body }` ); + // Look for priority indicators in body. const priorityRegex = - /###\sImpact\n\n(?.*)\n\n###\sAvailable\sworkarounds\?\n\n(?.*)\n/gm; + /###\sSite\sowner\simpact\n\n(?.*)\n\n###\sSeverity\n\n(?.*)\n\n###\sWhat\sother\simpact\(s\)\sdoes\sthis\sissue\shave\?\n\n(?.*)\n/gm; let match; while ( ( match = priorityRegex.exec( body ) ) ) { - const [ , impact = '', blocking = '' ] = match; + const { impact = '', extra = '' } = match.groups || {}; + let { severity = '' } = match.groups || {}; + const extras = extra.split( ', ' ); debug( - `find-priority: Reported priority indicators for issue: "${ impact }" / "${ blocking }"` + `find-priority: Reported priority indicators for issue: "${ impact }" / "${ severity }" / "${ extra }"` ); - if ( blocking === 'No and the platform is unusable' ) { - return impact === 'One' ? 'High' : 'BLOCKER'; - } else if ( blocking === 'No but the platform is still usable' ) { - return 'High'; - } else if ( blocking === 'Yes, difficult to implement' ) { - return impact === 'All' ? 'High' : 'Normal'; - } else if ( blocking !== '' && blocking !== '_No response_' ) { - return impact === 'All' || impact === 'Most (> 50%)' ? 'Normal' : 'Low'; + // Folks can provide additional information that can bump severity. + // We also do not want that extra information to downgrade the severity. + if ( extra !== '' && extra !== '_No response_' && ! extras.includes( 'No revenue impact' ) ) { + if ( + ( extras.includes( 'Individual site owner revenue' ) || + extras.includes( 'Agency or developer revenue' ) ) && + severity !== 'Critical' + ) { + severity = 'Major'; + } + // Bump severity to the max if platform revenue is impacted too. + if ( extras.includes( 'Platform revenue' ) ) { + severity = 'Critical'; + } + } + + const impactIndicators = { + isolated: 'Fewer than 20% of the total website/platform users', + scattered: 'Between 20% and 60% of the total website/platform users', + widespread: 'More than 60% of the total website/platform users', + }; + + if ( severity === 'Critical' ) { + priority = impact === impactIndicators.isolated ? 'High' : 'BLOCKER'; + } else if ( severity === 'Major' ) { + if ( impact === impactIndicators.widespread ) { + priority = 'BLOCKER'; + } else if ( impact === impactIndicators.scattered ) { + priority = 'High'; + } else { + priority = 'Normal'; + } + } else if ( severity === 'Moderate' ) { + if ( impact === impactIndicators.widespread ) { + priority = 'High'; + } else if ( impact === impactIndicators.scattered ) { + priority = 'Normal'; + } else { + priority = 'Low'; + } + } else if ( severity !== '' && severity !== '_No response_' ) { + priority = impact === impactIndicators.widespread ? 'Normal' : 'Low'; + } else { + priority = 'TBD'; } - return 'TBD'; } - debug( `find-priority: No priority indicators found.` ); - return 'TBD'; + debug( + `find-priority: ${ + priority === 'TBD' ? 'No' : priority + } priority indicators found. Priority set to ${ priority }.` + ); + return priority; } module.exports = findPriority;