← FinOpsAid blog

Is our review process the bottleneck? How to read the Pull Requests page without turning it into a scoreboard — FinOpsAid blog

Is our review process the bottleneck? How to read the Pull Requests page without turning it into a scoreboard

Open backlog, median time to close, review actions and the comment leaderboard — what each number measures, why the tracking floor matters, and which of these should never be used to rate a person.

Pull Requests is the one page in FinOpsAid with no dollar sign on it. It's here because review latency is the flow constraint that most often explains why CI cost and developer cost look the way they do — a 200-hour median time to close means work is sitting in a queue, and queues cost money in ways no billing API reports.

It's also the page most easily misused. Two of its cards rank people by name. Read the section on that before you show this page to anyone.

The tracking floor — read this first

Why early history on this page looks artificially thin The page is built from the latest roughly one hundred pull requests per repository. History therefore begins at whatever date that sample reaches back to, called the tracking floor. Data before the floor was never captured, so a chart that appears to show low activity in earlier months is showing an absence of capture, not an absence of work. THE TRACKING FLOOR — WHERE HISTORY ACTUALLY STARTS NOT CAPTURED older than the latest ~100 PRs TRACKING FLOOR REAL DATA every trend, leaderboard and median on this page is computed from here forward Setting Period to “Last 12 months” does not create history before the floor. A busy repo hits the 100-PR limit in weeks; a quiet one reaches back years. The floor differs per repo. The page states this in a footnote. Everything is “as of last sync”, never real-time.
The earliest date shown is a capture limit, not a quiet period. This matters most for the backlog chart, where the line naturally starts low and climbs as the sample fills in.

The KPI row

Tile What it counts Direction
Pull Requests Total PRs tracked. Footnote: "latest ~100 per repo". Neutral — it's a sample size, not an outcome.
Open Currently open PRs. Footnote breaks the rest into merged and closed-unmerged. Lower is generally better — open PRs are work in progress that isn't shipping.
Median time to close Median hours from open to close, humanised into minutes / hours / days. Footnote shows the mean alongside. Lower is better.
Review actions Total submitted reviews (approve, changes-requested, commented). Footnote: total comments. Neutral — activity, not quality.
Reviewer of the moment The single most active reviewer by review count, with their total. Not a ranking of merit. See below.

The median-and-mean pairing on tile three is deliberate and is the most useful thing on the row. If the mean is far above the median, you have a tail — most PRs close quickly and a handful sit for weeks. Fixing a tail is a different intervention from fixing a slow median: the tail is usually a few specific PRs nobody owns, while a slow median is a process problem.

A closed-unmerged count that rivals the merged count is worth a look too. Work that gets abandoned after review consumed CI minutes and reviewer hours for nothing.

Open PR backlog over time

The primary chart: open PRs outstanding as of each day, not opened per day. It's a cumulative level, like a queue depth, so it should be read the way you'd read a support-ticket backlog. A rising line means PRs are being opened faster than they're being closed, regardless of how hard anyone is working.

The header carries an "as of last sync" date. The Period filter (defaulting to 90 days here, longer than most pages) scopes it.

Opened per day and Closed per day

The two bar charts beneath split the backlog into its causes. Read them as a pair:

The two leaderboards — and what they are not

What the two developer leaderboards actually measure The most-commented developers card counts comments received on each author's own pull requests, which is an engagement signal and can rise for opposite reasons — deep collaboration or repeated rework. The reviewer of the month card counts review actions submitted by each reviewer, which measures review load carried, not review quality. TWO BOARDS, TWO DIFFERENT SUBJECTS MOST-COMMENTED DEVELOPERS Comments received on their PRs High can mean: valuable, complex work High can also mean: unclear PRs, rework Card subtitle: “not a performance score” REVIEWER OF THE MONTH Review actions submitted Approve + changes-requested + comment Measures load carried, not care taken A rubber-stamp approval counts the same Both boards show a “· N PRs” denominator next to each name. Read it. 40 comments across 3 PRs and 40 across 30 are completely different situations.
Neither board ranks people. The first identifies where review effort concentrates; the second identifies who is absorbing it — which is a bus-factor question, not a performance one.

The most defensible use of the reviewer board is spotting concentration: if one name carries most of the org's review actions, that person is a single point of failure and probably a bottleneck for everyone else's cycle time. That's an organisational finding with a clear fix, and it doesn't require judging anyone.

Recent pull requests

The detail table, newest first, showing the most recent PRs across every repository:

Column Meaning
PR Number and title, linking straight to GitHub.
Repo Links to that repository's page in FinOpsAid.
Author GitHub login, or a dash where unavailable.
State open (blue), merged (brand colour), or closed (grey) — merged and closed-unmerged are visually distinct on purpose.
Comments / Reviews Counts on that PR.
Open time How long it was (or has been) open, humanised — 45 m, 6 h, 3.2 d.

Sorting by Open time in your head down this column is the fastest way to find the specific PRs producing the tail in your mean-versus-median gap.

What people get wrong on this page

The 60-second read

Frequently asked questions

Why does the pull request history start so recently?

The page is built from the latest roughly 100 pull requests per repository, so history begins wherever that sample reaches back to — the tracking floor. A busy repo hits that limit in weeks. Selecting a longer period does not create history before the floor.

What does the gap between median and mean time to close mean?

A mean far above the median means you have a tail: most pull requests close quickly while a handful sit for weeks. That is a different problem from a slow median. A tail is usually a few specific unowned PRs; a slow median is a process problem.

Is the reviewer leaderboard a performance ranking?

No. It counts review actions submitted, which measures the review load a person carries rather than the care they take — a rubber-stamp approval counts the same as a thorough review. Its most defensible use is spotting concentration, where one person is a bottleneck and a single point of failure.

Want to see your own review flow? Connect your GitHub org — read-only and free during beta — or explore the demo first. Next: how to read the Teams page.