Skip to content

Commit

Permalink
Priority indicators: update logic to match new priority matrix (#40672)
Browse files Browse the repository at this point in the history
* Priority indicators: update logic to match new priority matrix

We now ask different questions in our issue templates:
#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 Automattic/wp-calypso#97049 (comment)

* Be more explicity in final logged priority message

See #40672 (comment)

* Support multiple potential extra details that can bump pri

See #40672 (comment)
  • Loading branch information
jeherve authored Jan 15, 2025
1 parent e8d1fd8 commit e3b32ec
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 15 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
Significance: major
Type: changed

Issue triage: update priority matrix.
Original file line number Diff line number Diff line change
Expand Up @@ -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(?<impact>.*)\n\n###\sAvailable\sworkarounds\?\n\n(?<blocking>.*)\n/gm;
/###\sSite\sowner\simpact\n\n(?<impact>.*)\n\n###\sSeverity\n\n(?<severity>.*)\n\n###\sWhat\sother\simpact\(s\)\sdoes\sthis\sissue\shave\?\n\n(?<extra>.*)\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;

0 comments on commit e3b32ec

Please sign in to comment.