WhistleDev All articles
Investigative Tech

Counting Approvals, Missing the Point: How Review Metrics Are Quietly Dismantling Code Safety

WhistleDev
Counting Approvals, Missing the Point: How Review Metrics Are Quietly Dismantling Code Safety

Photo: Official GDC, CC BY 2.0, via Wikimedia Commons

There is a particular kind of institutional irony at work when the process designed to catch dangerous code becomes the process most likely to let it through. Code review was never supposed to be fast. It was supposed to be thorough. Somewhere between the rise of continuous deployment pipelines and the obsession with engineering productivity dashboards, those two priorities quietly switched places—and the consequences are showing up in production systems across the country.

This is not a story about lazy developers. It is a story about what happens when organizations measure the wrong things with great precision.

The Dashboard That Broke the Gate

In theory, code review is a collaborative safety net. A developer submits changes, one or more peers examine the logic, flag security vulnerabilities, identify edge cases, and either approve or request revisions. The process is inherently deliberative. It requires time, context, and genuine engagement with what the code is actually doing.

In practice, at a growing number of US technology firms, code review has been absorbed into the same productivity measurement apparatus that tracks ticket velocity, deployment frequency, and sprint completion rates. Reviewers are now evaluated not just on whether they review code, but on how quickly they do it and how often their feedback results in approved merges.

The metrics themselves sound reasonable in isolation. Review turnaround time. Approval-to-revision ratio. Open pull request age. But when these numbers feed directly into performance evaluations, promotion decisions, and quarterly engineering scores, they stop describing behavior and start dictating it.

Developers learn what gets measured. Then they optimize for it.

What Gaming Looks Like From the Inside

Senior engineers who have worked inside organizations with formalized review metrics describe a consistent pattern. Early in the adoption of these systems, most developers attempt to maintain genuine review standards while also hitting the new benchmarks. Within one or two review cycles, the math becomes obvious: a thorough security review of a complex authentication change might take ninety minutes. The dashboard, however, rewards the person who clears five pull requests in that same window.

The pressure does not usually arrive as an explicit instruction. It arrives as a comparison. A team lead mentions during a one-on-one that a colleague's review turnaround is significantly faster. A manager references the department-wide review velocity chart in an all-hands meeting. A performance review notes that an engineer's "collaboration throughput" is below the team median.

None of these communications say: approve code you haven't read. But that is the behavior they reliably produce.

The resulting approvals are not fraudulent in any legal sense. The reviewer clicked the button. The system logged the action. The audit trail is clean. What the audit trail does not capture is the fifteen seconds of actual engagement that preceded the approval, or the SQL injection vector that a ten-minute review would have surfaced.

The Security Implications Are Not Hypothetical

Code review is one of the last human checkpoints before software reaches users. Automated static analysis tools catch certain classes of vulnerability reliably, but they remain blind to logical flaws, improper permission scoping, insecure data handling patterns, and the category of vulnerability that requires understanding what a piece of code is supposed to do before recognizing that it does something else entirely.

These are precisely the vulnerabilities that a rushed reviewer misses. Not because they lack the skill to identify them, but because identifying them requires the kind of sustained attention that a metric-optimized workflow systematically discourages.

The US software industry has seen the downstream results. Data exposures attributed to access control logic that passed review without scrutiny. Authentication bypasses embedded in code that received same-day approvals across multiple reviewers. Infrastructure misconfigurations that traveled through a review queue during a quarter-end push when every team was racing to close out open pull requests before the reporting period ended.

In each of these cases, the review process was technically completed. The metrics looked fine.

When Developers Raise Concerns and Get Overridden

Perhaps the most troubling dimension of metric-driven review culture is what happens to the developers who resist it. Engineers who consistently take longer to review code, who regularly request revisions, who decline to approve changes they consider insufficiently examined—these individuals accumulate a profile that looks, through the lens of a productivity dashboard, like underperformance.

Several developers who have spoken with WhistleDev describe variations of the same experience: raising a security concern during review, being told the timeline does not allow for the additional iteration, watching the code ship with the concern unresolved, and then finding themselves in a performance conversation about their inability to meet review velocity targets.

This dynamic creates a documented record that tells the wrong story. The engineer who slowed down to do the job correctly appears, in the official record, to be the problem.

Building the Documentation That Tells the Real Story

For developers navigating this environment, documentation is the primary tool for establishing an accurate record before a vulnerability becomes a crisis—or before a retaliation complaint becomes necessary.

When you submit a review that identifies a security concern and your feedback is dismissed or overridden, document the specific nature of the concern in writing. Use the pull request comment thread rather than a verbal conversation or a direct message that can be deleted. If a manager instructs you to approve code you have flagged as risky, request that instruction in writing. If that request is denied, send a follow-up email summarizing the conversation and the decision.

Preserve copies of review dashboards or performance feedback that reference your review velocity in a context that connects it to your security concerns. If your organization uses a ticketing system, file a formal ticket for any vulnerability you identify during review that is subsequently shipped without remediation. This creates a timestamped record of what you knew, when you knew it, and what you did with that knowledge.

Under certain circumstances—particularly when the software in question handles personal health information, financial data, or critical infrastructure—unresolved vulnerabilities that were identified and documented during review may meet the threshold for disclosure to external bodies, including the Cybersecurity and Infrastructure Security Agency, sector-specific regulators, or coordinated vulnerability disclosure programs operated by independent security researchers.

Measuring the Right Things

Organizations that have moved away from velocity-based review metrics in favor of quality-oriented measures describe a consistent improvement in both developer satisfaction and security outcomes. Review quality scores, based on the depth of feedback and the accuracy of identified issues, provide a more honest picture of reviewer engagement. Tracking the rate at which shipped code generates post-deployment defects creates accountability for the review process rather than just the review act.

These approaches are not radical. They require only a willingness to accept that thoroughness and speed are, in the domain of code review, genuinely competing values—and that an organization's choice between them is also a choice about how much it values the users whose data runs through the systems being reviewed.

The dashboard that measures approvals per hour is not neutral. It is a policy. And like any policy, it has authors who made a choice, and a record that can be examined when things go wrong.

All Articles

Related Articles

Certified and Compromised: How Security Audits Became a Performance for Paying Customers

Certified and Compromised: How Security Audits Became a Performance for Paying Customers

Frozen in Time: The Legal and Ethical Reckoning Waiting Inside Your Company's Untouchable Legacy Code

Frozen in Time: The Legal and Ethical Reckoning Waiting Inside Your Company's Untouchable Legacy Code

Approved and Ignored: When Peer Review Becomes a Permission Slip for Dangerous Code

Approved and Ignored: When Peer Review Becomes a Permission Slip for Dangerous Code