Skip to main content

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.

ValueMeaning
0Not started
1–99In progress
100Complete

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:

ChildPlanned work% CompleteWeighted contribution
Task A20h100%20 × 1.00 = 20
Task B40h50%40 × 0.50 = 20
Task C10h0%10 × 0.00 = 0
Total70h40

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.

tip

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

ScenarioApproach
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 childrenSet percent_complete manually (rollup has nothing to aggregate)
Override rollup for a parentSet 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