Skip to content

Commit 6adb6d7

Browse files
Copilotantonkovalenkoadameat
authored
feat: implement reach/impact/effort priority methodology (#2615)
Co-authored-by: copilot-swe-agent[bot] <[email protected]> Co-authored-by: antonkovalenko <[email protected]> Co-authored-by: adameat <[email protected]> Co-authored-by: Alexey Efimov <[email protected]>
1 parent 84e75ea commit 6adb6d7

File tree

1 file changed

+47
-8
lines changed

1 file changed

+47
-8
lines changed

.github/workflows/priority-score.yml

Lines changed: 47 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,19 +13,58 @@ jobs:
1313
with:
1414
github-token: ${{ secrets.YDBOT_TOKEN }}
1515
script: |
16-
const labelWeights = {
17-
"prio/high": 1000,
18-
"prio/medium": 500,
19-
"prio/low": 100
16+
// Priority estimation based on reach/impact/effort methodology
17+
const reachWeights = {
18+
"reach:high": 100,
19+
"reach:medium": 75,
20+
"reach:low": 50
21+
};
22+
23+
const impactWeights = {
24+
"impact:high": 200,
25+
"impact:medium": 137.5,
26+
"impact:low": 75
27+
};
28+
29+
const effortWeights = {
30+
"effort:high": 10,
31+
"effort:medium": 5,
32+
"effort:low": 2
2033
};
2134
2235
const issue = context.payload.issue;
2336
const labels = issue.labels.map(l => l.name);
24-
const basePriority = Math.min(...labels.map(l => labelWeights[l] || 10), 1000);
2537
26-
const createdAt = new Date(issue.created_at);
27-
const daysOld = Math.floor((Date.now() - createdAt.getTime()) / (1000 * 60 * 60 * 24));
28-
const finalScore = basePriority + daysOld;
38+
// Find reach, impact, and effort values from labels
39+
let reach = null;
40+
let impact = null;
41+
let effort = null;
42+
43+
for (const label of labels) {
44+
if (reachWeights[label] !== undefined) {
45+
reach = reachWeights[label];
46+
}
47+
if (impactWeights[label] !== undefined) {
48+
impact = impactWeights[label];
49+
}
50+
if (effortWeights[label] !== undefined) {
51+
effort = effortWeights[label];
52+
}
53+
}
54+
55+
// Calculate priority score using formula: (reach * impact) / effort
56+
let finalScore = 0;
57+
if (reach !== null && impact !== null && effort !== null) {
58+
finalScore = Math.round((reach * impact) / effort);
59+
} else {
60+
// Fallback to default values if labels are missing
61+
const defaultReach = reach || 50; // default to medium-low reach
62+
const defaultImpact = impact || 75; // default to low impact
63+
const defaultEffort = effort || 5; // default to medium effort
64+
finalScore = Math.round((defaultReach * defaultImpact) / defaultEffort);
65+
}
66+
67+
console.log(`📊 Priority calculation: reach=${reach || 'default'}, impact=${impact || 'default'}, effort=${effort || 'default'} → score=${finalScore}`);
2968
3069
const projectNumber = 24;
3170
const org = "ydb-platform";

0 commit comments

Comments
 (0)