clement13.net
Original photo: Tableau de bord d’un petit avion, avec ses cadrans, ses manettes et ses rangées de commutateurs.
Description
Tableau de bord d’un petit avion, avec ses cadrans, ses manettes et ses rangées de commutateurs.
Source
U.S. Fish and Wildlife Service · original page
Licence
PD Public domain
Original photo, unretouched. The background is a version of it stylised by the site.

Project Metrics and Reporting

You will learn how to calculate and interpret velocity, burndown/burnup, cumulative flow diagram, lead time, cycle time, throughput, WIP, and how they relate (Little's Law).

Guide≈ 12 min readPartly checkedPartial checkThe main facts were checked by searching the cited sources. The items below still need checking before relying on them.To re-check
  • Seuil « élite = plusieurs déploiements par jour » : source secondaire (DevLake citant DORA 2023)
  • Repères pratiques (vélocité fiable après 4 à 6 sprints, percentiles 50/85/95) : pratiques courantes, non sourcées
Written with AI assistance; sources are cited at the bottom of the page. An error? Report it via clement13.net.
Reading
In brief
  • You will know how to calculate and interpret velocity, burndown/burnup, cumulative flow diagram, lead time, cycle time, throughput, WIP, and how they relate (Little's Law).
  • You will understand DORA metrics and their limits outside a purely software context.
  • You will know how to measure estimation quality and backlog health.
  • You will have metrics specific to data projects: freshness, data incidents, rejection rate, acceptance testing gaps.
  • You will know how to avoid pitfalls from Goodhart's Law, and build a Power BI dashboard on Azure DevOps.

Rating context: team of 5 to 15 people, data/BI. Ratings /5 are assessments (see RATING).

On this page

Level: 🟢→🔴

🟢 Novice — Why measure, and what#

Measuring is for deciding and learning, not monitoring. A good metric answers a question the team is actually asking: “are we delivering predictably?”, “where is work waiting?”, “is quality dropping?”. Before choosing an indicator, write down the question and the decision the answer can change; without a decision, don't measure.

Three categories:

Category Question Examples
Flow how fast and how consistently does work move through? lead time, cycle time, throughput, WIP, item age
Value and quality is what we deliver useful, and is it reliable? escaped defects, incidents, rejection rate, satisfaction, adoption
Prediction will we reach the goal? velocity, burndown/burnup, probabilistic forecast
✅ Good practice

Prefer fewer metrics, read as trends, over many metrics read as absolute values. An isolated value (“cycle time = 6 days”) says nothing; its distribution and trend say everything.

🟢 Basic definitions#

Term Definition Start → end
Lead time total duration for the requester request creation → delivery
Cycle time team work duration work start → finish
Throughput (rate) number of items completed per period items/week
WIP started, unfinished items inventory at time t
Velocity story points completed per sprint sum of sprint “Done” points
Wait time portion of lead time with no active work lead time − active time
⚠️ Pitfall

Symptom: two teams compare a “cycle time” that doesn't mean the same thing. Cause: boundaries (start, finish) are not the same. Remedy: write, in the wiki, the start state and end state for each metric; they must be identical across teams being compared.

🟡 Hands-on — Velocity, burndown, burnup#

Velocity#

Sprint n velocity = Σ story points “Done” at close of sprint n
Reference velocity = average (or median) of the last 3 to 5 sprints
Range = [min ; max] of recent sprints, more meaningful than the average

Velocity is a local planning tool for the team, not a performance indicator, nor a way to compare two teams (points don't have the same unit from one team to another). It becomes reliable after 4 to 6 stable sprints (same team, same duration).

🧪 Example

Velocities of the last 5 sprints: 21, 18, 25, 20, 22 → average 21.2; median 21; range 18–25. A backlog with 190 points remaining gives a range of ≈ 7.6 to 10.6 sprints, or about 8 to 11 sprints. Announce the range, not the average figure.

Sprint burndown#

Curve of remaining work (hours or points) by sprint day, compared with the ideal line. Read it as: a cliff at the end of the sprint = work not broken down or late updates; a long flat line = blockage or tasks that are too large; an upward move = scope increase.

Burnup (preferred)#

Two curves: cumulative completed work and total scope. Unlike burndown, scope is visible: a rising scope line explains why the finish moves out.

        Points
  200 ┤                          ·· scope (rising: added)
  150 ┤                    ····
  100 ┤            ·····  /──── completed (cumulative)
   50 ┤      /─────
    0 ┼──┴───────────────────────────→ sprints
💡 Expert tip

For an evolving release (common in data projects where sources are discovered along the way), release burnup, paired with a probabilistic forecast (see below), is more honest than any Gantt chart.

🟡 Hands-on — Flow: CFD, lead/cycle time, throughput, WIP#

Cumulative flow diagram (CFD)#

Each band represents a state (Backlog, In Progress, In Acceptance Testing, Done); a band's height at a date = number of items in that state. How to read it:

Shape Meaning
Parallel bands healthy flow
“In Progress” band widening WIP growing: buildup
“In Acceptance Testing” band growing acceptance testing bottleneck (common in data: business validation)
Horizontal plateau in “Done” nothing is being delivered

Little's Law#

Average lead time = Average WIP / Average throughput        (steady state)
Example: WIP = 12 items, throughput = 3 items/week → average lead time = 4 weeks
To divide lead time by 2 at constant throughput: divide WIP by 2.

This is the core argument for WIP limits: reducing work in progress speeds up delivery without anyone working faster. See Agile and Lean Methods (Manifesto, Kanban, XP, Lean, Shape Up, DSDM, SAFe, DevOps…).

Lead time and cycle time: percentiles, not average#

Durations are asymmetrical (heavy tail); the average is misleading. Use percentiles:

Percentile Interpretation
50% (median) typical case
85% “85% of items are completed in ≤ X days”: basis for a realistic commitment
95% painful cases; analyze them

The scatterplot diagram (scatterplot, one point per completed item) makes these thresholds visible.

Age of in-progress items (aging WIP)#

For each in-progress item: age = today − start date. Compare with the 85% range: anything above it deserves action now (more useful than lead time, which only exists afterward).

Probabilistic forecasting (Monte Carlo)#

Rather than extrapolating an average, resample historical throughput to estimate a date range. Mini PowerShell script for illustration:

# Forecast: how many weeks to complete 40 items? (historical weekly throughput)
$debits = 3,5,2,4,6,3,2,5,4,3          # items completed per week, 10 weeks
$reste = 40; $essais = 10000; $res = @()
$rnd = New-Object System.Random 42
1..$essais | ForEach-Object {
    $faits = 0; $sem = 0
    while ($faits -lt $reste) { $faits += $debits[$rnd.Next(0,$debits.Count)]; $sem++ }
    $res += $sem
}
$tri = $res | Sort-Object
"P50 = {0} wk ; P85 = {1} wk ; P95 = {2} wk" -f $tri[[int]($essais*0.50)], $tri[[int]($essais*0.85)], $tri[[int]($essais*0.95)]
⚠️ Pitfall

Symptom: the forecast is constantly disproven. Cause: history is not representative (team changed, highly heterogeneous item sizes, vacation periods). Remedy: use only comparable periods, split items to a homogeneous size (“right-sizing”), and redo the forecast each period.

🟡 Hands-on — DORA and delivery metrics#

DORA metrics (the DevOps Research and Assessment research program, popularized by the book Accelerate by Nicole Forsgren, Jez Humble, and Gene Kim, 2018) measure software delivery performance. The four historical metrics:

Metric Question Measure
Deployment frequency how often do we deliver to production? deployments / day or week
Lead time for changes (lead time for changes) how long between commit and production? duration commit → production deployment
Change failure rate what share of deployments requires immediate intervention (rollback, hotfix)? failed deployments / deployments
Failed deployment recovery time (failed deployment recovery time, formerly time to restore service) how long to recover from a failed deployment? duration failed deployment → recovery

DORA has since evolved this metric set: in 2023, recovery time was redefined (recovery after a failed deployment, not after any outage); since the 2024 report, DORA includes five metrics, with deployment rework rate (deployment rework rate: share of unplanned deployments following a production incident), split between throughput (lead time, frequency, recovery) and stability (failure rate, rework rate). DORA also warns against using these metrics as targets and against comparisons across very different applications.

⚠️ Pitfall

DORA out of context. Symptom: teams apply “elite” thresholds (deploy several times per day) to a datamart delivered in monthly packages. Cause: thresholds are built from software organizations practicing continuous deployment. Remedy: keep the spirit (reduce batch size, automate, shorten recovery) and track your own trend; the target frequency for an installation package is not that of a web application. See CI/CD for Data: Databases, Datamarts, Pipelines, and Reports.

🟡 Practice — Quality of Estimates#

An estimate is a bet with a margin. Measuring its quality helps improve it without turning it into absolute truth.

Indicator Formula Interpretation
Commitment fulfillment rate completed points / points committed in the sprint stable 80–100%: healthy; chronic < 70%: overcommitment
Estimation bias Σ(actual − estimated) / Σ estimated > 0: systematic underestimation
Dispersion standard deviation of (actual/estimated) high: unreliable estimates → break down further
Share of scope added during sprint added points / committed points high: interruptions or poor refinement
Re-estimation rate re-estimated items / items high: unstable requirements
💡 Expert tip

Compare the estimate with actual cycle time by size (S/M/L). If “M” items take from 2 to 15 days, size has no predictive power: it's better to break down than to estimate better. See Planning and Estimation (PLA).

🟡 Practice — Backlog Health#

Indicator Formula / query Attention threshold (benchmark, to calibrate)
Depth ready items / velocity < 2 sprints ready: shortage risk; > 6 sprints: unnecessary stock
Average age average of (today − creation) continuous growth = aging stock
Items with no movement > 6 months ChangedDate < today−180 to close or refine
Readiness rate items with acceptance criteria / total at the top of the backlog < 80%: insufficient refinement
Open bugs / delivered stories ratio trend rising: quality debt
Items without parent link query broken traceability
✅ Good practice

Set a maximum backlog size (for example, 3 months of work): anything beyond that is archived. The backlog is not an archive of wishes.

🔴 Expert — Metrics Specific to Data Projects#

A datamart or reporting project has measurement objects that software metrics ignore. See also data project management (matrix).

Metric Definition Formula Why
Freshness (freshness) age of the most recent data compared with the expected time now − max(load_date) users' first question
Load window compliance share of loads completed before the cutoff time on-time loads / loads service commitment
Data incidents number of incidents (wrong values, missing values, duplicates) per period, by severity count + MTTR quality health
Rejection rate rejected rows / rows read at integration rejected / read data contract, source drift
Completeness share of critical fields populated non-null / total quality
Uniqueness / duplication duplicate keys / rows duplicates / rows integrity
Reconciliation difference between source total and target total |Σ source − Σ target| accuracy of figures
Acceptance testing variance difference between reference figure and report figure |report − reference| business validation
Replay time time to replay a load after correction minutes/hours resilience
Adoption rate active users / target users by report and by month real value
Escaped defects issues reported by users after delivery per kit acceptance testing quality

T-SQL example for measuring freshness and rejection rate from a log table (conventional, adapt to actual names):

-- Fraîcheur par table cible (en heures) et dépassement du seuil
SELECT  j.Table_Cible,
        MAX(j.Date_Fin_Chargement)                                   AS Dernier_Chargement,
        DATEDIFF(HOUR, MAX(j.Date_Fin_Chargement), SYSDATETIME())    AS Age_Heures,
        CASE WHEN DATEDIFF(HOUR, MAX(j.Date_Fin_Chargement), SYSDATETIME()) > s.Seuil_Heures
             THEN 1 ELSE 0 END                                        AS Hors_Seuil
FROM    [dbo].[Journal_Chargement]  AS j WITH (NOLOCK)
JOIN    [dbo].[Seuil_Fraicheur]     AS s WITH (NOLOCK) ON s.Table_Cible = j.Table_Cible
WHERE   j.Statut = 'OK'
GROUP BY j.Table_Cible, s.Seuil_Heures;

-- Taux de rejet par source et par jour
SELECT  CAST(j.Date_Debut AS date)                         AS Jour,
        j.Source,
        SUM(j.Lignes_Rejetees) * 1.0 / NULLIF(SUM(j.Lignes_Lues), 0) AS Taux_Rejet
FROM    [dbo].[Journal_Chargement] AS j WITH (NOLOCK)
GROUP BY CAST(j.Date_Debut AS date), j.Source;
🧪 Example

A datamart fed by an SFA application is consolidated nightly. Metrics tracked over 8 weeks: window met 96% of nights (commitment 95%); median rejection rate 0.2% but a spike at 3% the day after a source application version rollout (schema drift); two reconciliation incidents (difference > 0.1% on revenue) handled in < 4 h. Rejection spikes now trigger an alert before users notice the gap.

⚠️ Pitfall

Symptom: all indicators are green but users complain about wrong figures. Cause: execution is measured (processing ran) rather than accuracy (result is correct). Remedy: add reconciliation checks and tests against reference figures, not only execution statuses.

🔴 Expert — Goodhart's Law and Perverse Uses#

“When a measure becomes a target, it ceases to be a good measure.” — Goodhart's law (common wording, attributed to Marilyn Strathern, 1997, for this version).

Metric Typical misuse Countermeasure
Velocity point inflation, artificial splitting never compare it across teams or tie it to bonuses
Number of closed tickets tickets split into tiny pieces, closed without value measure delivered value and escaped defects at the same time
Test coverage tests without assertions combine with escaped defect rate
Lead time “reopened” items moved into new tickets also track reopenings
Low rejection rate rejection rules loosened check downstream completeness
Entered hours “compliance” time entry measure flow, not hours

Defense rules: (1) measure in pairs (speed + quality), (2) display the trend, (3) keep metrics for the team first, (4) review regularly: remove any metric that no longer supports a decision, (5) distinguish diagnostic metrics (explored) and objectives (rare, few in number).

🔴 Expert — Power BI Dashboards on Azure DevOps#

Source: Analytics OData feed (see Azure DevOps Server (Formerly TFS) In Depth). Recommended model: WorkItemSnapshot (daily flow fact), WorkItem (current), Iteration, Area, User, Date.

Useful pages: (1) Current sprint (burndown, capacity, blocked), (2) Flow (CFD, WIP, item age, cycle time scatterplot), (3) Quality (open bugs, aging, escaped defects, test cases), (4) Release / burnup (scope vs completed), (5) Backlog health.

Typical DAX measures:

WIP actuel =
CALCULATE ( DISTINCTCOUNT ( WorkItem[WorkItemId] ),
            WorkItem[State] IN { "Active", "In Progress", "Committed" } )

Throughput hebdo =
CALCULATE ( DISTINCTCOUNT ( WorkItem[WorkItemId] ),
            WorkItem[CompletedDate] <> BLANK(),
            DATESINPERIOD ( 'Date'[Date], MAX ( 'Date'[Date] ), -7, DAY ) )

Cycle time P85 (jours) =
PERCENTILEX.INC ( FILTER ( WorkItem, NOT ISBLANK ( WorkItem[CycleTimeDays] ) ),
                  WorkItem[CycleTimeDays], 0.85 )

Taux d'engagement tenu =
DIVIDE ( [Points terminés du sprint], [Points engagés au démarrage] )

Design best practices, detailed in Cross-Cutting Power BI Best Practices: a star schema model, no import of all revisions, explicit measures, a clean theme, event annotations (team change, vacations) to explain breaks.

✅ Good practice

Put on the first page: the supported decision (“Can we hit the release date?”), 3 to 5 indicators, their trend, and interpretation text written by a human. A chart without reading guidance is decoration.

Metrics — Which Metrics Are Worth Their Cost?#

Metric Usefulness Collection effort Misuse risk Utility/cost ratio rating
Cycle time (percentiles) high low if states are reliable medium 5/5
Throughput + WIP high low low 5/5
Age of in-progress items high low low 5/5
Release burnup high low to medium medium 4/5
Velocity medium (local) low high 3/5
Sprint burndown medium medium (task updates) medium 3/5
DORA (software) high if CD medium to high medium 3/5 for a datamart in kits
Entered hours low high high 1/5
Freshness / reconciliation (data) very high medium low 5/5

🤖 AI Contribution#

Use case Benefit /5 Risk /5 Maturity /5 Guardrails
Drafting the interpretation of a dashboard 4 3 4 human review required; AI must not invent causes
Detecting flow anomalies (WIP, age) 3 2 3 explained thresholds, tracked false positives
Delivery forecasting 3 4 3 stick to explainable methods (Monte Carlo); do not hide uncertainty
Writing DAX/WIQL/OData queries 3 2 4 test on a sample
Retrospective summary from metrics 3 2 4 does not replace team discussion

See 11 — AI in Planning and Version Control Tools.

See also#

✻ Written by Claude Sonnet 5.5