Percent complete: manual entry and rollup
Raytio PPM tracks progress through two complementary mechanisms: manual percent complete on individual work items, and weighted rollup through a database view that computes progress for parent items from their children.
Manual percent complete
Every work item has a percent_complete field that can be set directly. This is a simple integer from 0 to 100 representing the user's assessment of how far along the work item is.
| Value | Meaning |
|---|---|
| 0 | Not started |
| 1–99 | In progress |
| 100 | Complete |
Manual percent complete is subjective — it reflects the team member's or project manager's judgement. There is no automatic calculation based on time elapsed, work logged, or any other metric. Putting the judgement in the hands of the person doing or managing the work keeps progress reporting meaningful, especially for work that doesn't map cleanly to elapsed time or hours logged.
Rollup via ppm_work_item_progress
While leaf work items use manual percent complete, parent work items (epics, features, and other containers) often need to show aggregate progress. Raytio PPM provides the ppm_work_item_progress database view for this purpose.
How the rollup works
The view computes a weighted average of child percent complete values, using planned_work as the weight:
Parent % Complete = Σ (child.percent_complete × child.planned_work)
÷ Σ (child.planned_work)
This means a child with more planned work has a proportionally larger effect on the parent's progress.
Worked example
Consider an epic with three child tasks:
| Child | Planned work | % Complete | Weighted contribution |
|---|---|---|---|
| Task A | 20h | 100% | 20 × 1.00 = 20 |
| Task B | 40h | 50% | 40 × 0.50 = 20 |
| Task C | 10h | 0% | 10 × 0.00 = 0 |
| Total | 70h | 40 |
Epic % complete = 40 / 70 = 57%
Without weighting, the simple average would be (100 + 50 + 0) / 3 = 50%. The weighted rollup gives a more accurate picture because Task B (the largest piece of work) being half done contributes more than Task C (the smallest) being not started.
What if planned work is not set?
If a child work item has no planned_work value (null or zero), it is treated as having equal weight with other unweighted items. This prevents items from being silently excluded from the rollup. However, the rollup is most accurate when all child items have planned work values set.
For the most meaningful rollup, ensure all leaf work items have planned_work set. Even rough estimates (4h, 8h, 40h) dramatically improve the accuracy of parent-level progress reporting compared to unweighted averages.
Rollup depth
The ppm_work_item_progress view computes rollup at each level of the hierarchy. A top-level epic rolls up from its child features, which in turn roll up from their child tasks. Each level's rollup is based on its direct children's progress — it is computed recursively through the work item tree.
Manual vs rollup: when to use which
| Scenario | Approach |
|---|---|
| Leaf work item (task, bug, sub-task) | Set percent_complete manually |
| Parent work item (epic, feature) | Read from ppm_work_item_progress for the weighted rollup |
| Parent with no children | Set percent_complete manually (rollup has nothing to aggregate) |
| Override rollup for a parent | Set percent_complete manually — the manual value takes precedence when explicitly set |
The two mechanisms complement each other:
- Manual entry is the source of truth for individual work items
- Rollup aggregates those manual values into meaningful parent-level summaries
- You always have the option to override the rollup with a manual value if the computed figure doesn't reflect reality
Percent complete and baselines
When you save a baseline, the current percent_complete values are captured as part of the snapshot. The ppm_baseline_variance view can then compare the baseline's percent complete against the current value, showing whether work items are progressing faster or slower than planned.
See Baselines and variance for details on how variance is computed.
Further reading
- Work, duration, and elapsed time — how
planned_work(the rollup weight) relates to duration and calendar time - Baselines and variance — how percent complete snapshots feed into variance analysis