

- 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
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).
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
- 🟢 Novice — Why measure, and what
- 🟡 Hands-on — Velocity, burndown, burnup
- 🟡 Hands-on — Flow: CFD, lead/cycle time, throughput, WIP
- 🟡 Hands-on — DORA and delivery metrics
- 🟡 Practice — Quality of Estimates
- 🟡 Practice — Backlog Health
- 🔴 Expert — Metrics Specific to Data Projects
- 🔴 Expert — Goodhart's Law and Perverse Uses
- 🔴 Expert — Power BI Dashboards on Azure DevOps
- Metrics — Which Metrics Are Worth Their Cost?
- 🤖 AI Contribution
- See also
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 |
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 |
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).
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
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)]
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.
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 |
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 |
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;
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.
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.
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#
- Overview · Azure DevOps Server (Formerly TFS) In Depth · Jira In Depth and Alternatives · Comparison
- Scrum in Practice · Scrum and data · CI/CD
- Data Quality (matrix) · Governance and Steering (GOU) (matrix) · Glossary
✻ Written by Claude Sonnet 5.5