The code is correct - it sums f.effort (raw Fibonacci points), not WSJF. Let me check where the features come from to see what effort value is being passed:
I see - ReleaseFeature.effort is the effort value stored when assigning features to a release. Let me check how features are assigned to see what value is stored:
The API accepts effort from the client. Let me check what value is being passed when features are assigned:
Found it! Line 356 shows effort: r.avgEffort - so when assigning features, the code uses avgEffort which is the average of all voter effort scores, NOT the raw effort values.
For example, if 6 voters gave efforts of [3, 5, 5, 13, 5, 3], the avgEffort would be 5.67, not 34 (the sum).
The capacity calculation is correct - it sums the effort values. But the effort stored is already an average per feature, not the full effort. So if you have 5 features with avgEffort values of [2, 3, 3, 2, 3], the total would be 13 points.
This is actually the correct behavior - you want to sum the average effort estimates per feature, not multiply by number of voters.
Can you share what features are in your April release and their individual effort values? The total should be the sum of each feature's effort field. If you're expecting 25 points total but seeing 13, either:
null effort values (and are being skipped)Would you like me to add debug logging to show exactly which features and effort values are being summed?
Based on your screenshot, the features show:
The issue is that when features are assigned to a release, the effort values are snapshotted at that moment. If you later reopened voting and updated the effort scores, the release_features table still has the OLD values from when you first assigned them.
No SQL script needed. You have two options:
This would add a button to sync the release features with the latest voting results without removing/re-adding.
Would you like me to implement Option 2? It would be a single button on the release header that updates all feature snapshots (effort, WSJF, quadrant) from the current voting results.
You can send messages while the preview loads