Project Prediction based on Epic points - Story points

Greetings,

I need to create a burndown report that considers both Epic point estimates and Story point estimates. Our hierarchy with Advanced Roadmaps is Initiatives → Epics → Stories. We have a process where we estimate the Epics under each Initiative using the ‘Story Points’ field that we have exposed there. Later in the refinement process, we create Stories under the Epics and those Stories are then pointed in the ‘Story Points’ field. To get a true picture of the total ‘effort’, I need to subtract the Story Point values from their parent Epic values to better understand the effort. The idea is like the cone of uncertainty: When we estimate Epics, we know less, but when we estimate Stories, we know more. Therefore, our Story Points are likely more accurate. So consider this example:

Epic #1 is created and is estimated at 25 points. No linked Stories exist yet, so my estimation for Epic #1 = 25 points. A week later, I have 5 Stories linked to the Epic and the sum of those Story Points = 15 points. Now, I want my Epic overall effort estimate to reflect 15 (from the Stories) + 10 remaining from the Epic. I don’t want to simply add Epic points + Story points, as that becomes an inflated estimate. I want to simply reduce the Epic estimate by the sum of the Story Points estimates. Where this gets tricky is if the actual Story Points exceeds the Epic estimation - which is entirely possible. So maybe Epic #2 is estimated at 30 points but the sum of the Stories added over time = 40 points. I want the 40 points as my overall effort because it’s a more confident number. So if the sum of Story points exceeds Epic point, I ignore the Epic estimate.

If I can create a measure to calculate what I described above, and call this measure ‘Effort’, then I have a more accurate idea of the work in front of me. Next, I want to use this measure in a burndown. As the actual Stories get moved to ‘Closed’ (not Resolved) status, then the related points are considered done. Ideally I want to see where this puts me on a timeline. Though I am not using a FixVersion (release) for this, I still know my start date and targeted end date, so if necessary, I can include those in the calculation. See the attached screenshot as an example of one that we are using today. It has flaws, but is visually the kind of thing we are looking for. We could also use something like the eazyBI ‘Project Prediction Report’ if we could get the data right as mentioned above.

Can you help guide me down the right path on this? I’m assuming one or more custom measures would get me the data I need? Thoughts?

Thanks!
Drew

1 Like

Hi @drewwiseman

Thanks for the in-depth explanation of your workflow. This greatly helped me understand your needs and what the possible solution could be!

You could try the following formula that iterates through all Epics and only returns a set of Epics that have not been resolved for the respective time period and that have Story Points (SP) added to them.
Next, the CASE statement checks for each of these Epics if their SP count is greater than the SP of their stories or not. If yes, then the Cumulative Story points resolved for Stories are subtracted from the Epic SP. If not, then the Cumulative Story points resolved for Stories are subtracted from the total original number of Story SPs.

Sum(
  Filter(
    DescendantsSet([Issue.Epic].CurrentMember,[Issue.Epic].[Epic]),
    (NOT 
    DateBeforePeriodEnd(
      [Issue.Epic].CurrentMember.Get('Resolved at'),
      [Time].CurrentHierarchyMember
    )
    OR
    NOT
    DateInPeriod(
      [Issue.Epic].CurrentMember.Get('Resolved at'),
      [Time].CurrentHierarchyMember
    )
    )
    AND
    (
      [Measures].[Story Points created],
      [Issue Type].[Epic],
      [Time].DefaultMember
    ) > 0
  ),
  CASE WHEN
  (
    [Measures].[Story Points created],
    [Issue Type].[Epic],
    [Time].DefaultMember
  )
  >
  (
    [Measures].[Story Points created],
    [Issue Type].[Story],
    [Time].DefaultMember
  )
  THEN
  (
    [Measures].[Story Points created],
    [Issue Type].[Epic],
    [Time].DefaultMember
  )
  - 
  (
    [Measures].[Cumulative Story Points resolved],
    [Issue Type].[Story]
  )
  ELSE
  (
    [Measures].[Story Points created],
    [Issue Type].[Story],
    [Time].DefaultMember
  )
  -
  (
    [Measures].[Cumulative Story Points resolved],
    [Issue Type].[Story]
  )
  END
)

For the “Ideal” line in the chart, you can use your own custom dates in the “Burn-down” measure from this Demo report: Story points burn-up in epic over time - Issues - Jira Demo - eazyBI

Let me know if this measure fits your use case! I had limited possibilities to test this, so I would appreciate it if you could validate that the expected data is showing up!
Thanks!
Best regards,
Nauris / eazyBI support

Hi Nauris,

Thanks for the response. I followed your instructions. The only thing I changed was that on the measure, I used ‘closed’ instead of ‘resolved’. I also imported the suggested report and used that. However, as shown in the screenshots, this isn’t working. I looked at the ‘Burn Down’ measure to try to add custom dates, and I don’t understand how to do that. It currently shows “Epic Start Date” and “Epic End Date”, but there is no such thing in JQL so I don’t even know where that is coming from.

I’m afraid this one is a bit too far over my head. I’m not even sure where to start. I may try to look for a different approach unless you have another suggestion.

Thanks,
Drew


Hi @drewwiseman

My apologies, I completely missed your reply!

In the demo report, I previously linked: Story points burn-up in epic over time - Issues - Jira Demo - eazyBI.
You can see both the “Epic Start Date” and “Epic End Date” measures defined in the “User defined” section of the Measures dimension. In the comments of the formulas, you can see the logic explained- for example, if all the issues are resolved in the Epic, then “Epic End Date” is the last resolution date, if not, then the last “Due date” will be used.

Let me know if you need any assistance with this!
Thanks!
Nauris