Development

Checklists That Catch What a Second Reviewer Misses

Antonio Evans8 min read

A three-column checklist taped to a wall.
Key points

Key points

  1. 1A checklist line works only when it demands a yes or no answer backed by a named artifact, such as a log line, a diff hunk, a config value or a plan output.
  2. 2Split authorship between three roles: the author, the agent operator, and a second reviewer, and give each line to exactly one of them.
  3. 3The second reviewer's list should stay short and cover what the other two cannot see: intent, blast radius and rollback.
  4. 4Test the template against a past incident by asking, line by line, whether a truthful answer would have blocked that release.

Why a second reviewer misses things a checklist catches

A second reviewer reads for comprehension. They build a mental model of the change, compare it with what the author described, and flag places where the two diverge. That is the right instinct for finding unclear naming, missing tests and logic errors. It is the wrong instrument for defects that are invisible in the diff: a migration that blocks reads on a busy table, an agent that retried a destructive call three times, a config value that only exists in production.

The Turing Way's review guidance separates checklists for the coder from checklists for the reviewer, and it further splits the reviewer's list into whole-program concerns versus individual-file concerns (The Turing Way). That split matters because a single reviewer carrying both lists will skip the one they find less interesting. Marc Roussy makes the same point about long checklists: they get long, then they get skipped, so the list should stay focused on the highest-importance issues (Marc Roussy).

The fix is not a longer checklist. It is a checklist where every line names its evidence source, so a reviewer cannot answer "yes" from memory. "Is the migration safe?" invites a shrug. "Does the migration include a lock_timeout value, and what is it?" demands a number that either appears in the diff or does not.

The anatomy of a line that cannot be answered vaguely

A falsifiable checklist line has four parts: a question, a named artifact, an expected answer, and a consequence. Here is the pattern.

Q: Does the change set a lock_timeout before every DDL statement?
Evidence: grep for "SET lock_timeout" and "SET LOCAL lock_timeout" in the migration file.
Pass: at least one value, in the migration, before the first ALTER.
Fail: missing, or set only in the database's global config.
Assignee: author.

Compare that with "Is the migration safe?" That line cannot fail, so it does not catch anything. The evidence requirement is what converts a review into an audit.

This matters because the failure modes are real. A DDL statement acquiring a lock in PostgreSQL queues behind any long-running transaction holding a conflicting lock, and every statement arriving afterwards queues behind the DDL, even statements that would otherwise be compatible (Xata). A one-millisecond ALTER TABLE can therefore turn an idle transaction into a full outage (Medium). A reviewer reading the diff sees a small, correct change. Only a checklist line that asks for the lock_timeout setting catches the defect.

The same pattern works outside databases. Hatchworks' agent security checklist anchors its items to identity, least privilege and monitoring, each answerable by pointing at a registry entry, a scope list or a log (Hatchworks). Viktor's buyer checklist goes further and attaches a pass test to every question, such as an action log an administrator can open (Viktor). Copy that habit into every line.

Splitting the list between three roles

The sign-off matrix works when each line belongs to exactly one role. Two people answering the same question produces two shallow answers and one gap.

RoleOwnsExample lineEvidence
AuthorThe change matches its stated intentDoes the diff contain only the files named in the plan?git diff --stat against the plan file
AuthorReversibility of the codeIs there a down/rollback path, and has it run locally?Migration file plus local run log
Agent operatorTool calls stayed in boundsDid the agent invoke only allowlisted tools for this task?Agent action log, one run
Agent operatorNo silent retries on writesAre retries disabled or capped for destructive calls?Agent config plus log sequence
Second reviewerBlast radiusWhich tables and services does this touch at peak, and what is the lock type on each?Lock table in the vendor docs
Second reviewerRollback under loadWhat is the exact command to undo this, and how long does it take on the largest table?Rehearsal output or runbook step

The author's lines are mechanical. They can be answered by the person who wrote the change, and they should be answered before the pull request is opened, the way The Turing Way puts local test runs and CI status on the coder's list (The Turing Way).

The agent operator's lines exist because an agent does not have an author's sense of consequence. An agent will retry a failed step, call a tool it was not told to avoid, or run up charges if a credential leaks. Keeping retries off destructive calls and verifying the tool allowlist are operator questions, not author questions.

The second reviewer's lines are the ones that actually need fresh eyes. Keep them to five or fewer. Each one should be unanswerable by reading the diff alone.

What the second reviewer should actually check

The second reviewer's job is intent, blast radius and rollback. Everything else has been handled upstream, or should have been.

Intent. Does the change do what the ticket says, and nothing else? Ask for the ticket number and a one-line summary of the intended outcome, then ask whether any hunk in the diff serves a purpose not described in that summary. This catches scope creep and stray debugging code that the author's own review will not.

Blast radius. For database changes, the reviewer should name the lock each statement takes and how long it is held. Most ALTER TABLE forms take an ACCESS EXCLUSIVE lock, and the dangerous ones hold it for the duration of a full table rewrite (DBGorilla). The reviewer does not need to know the answer from memory; they need to make the author produce the table row that says it. For an index build, the answer is CREATE INDEX CONCURRENTLY, which does not block writes but leaves an invalid index behind if it fails (Citus Data).

Rollback. Not "can this be reverted" but "what is the command, and how long does it take." A rollback that requires another exclusive lock on the same table is a second outage waiting to happen. Petcona's online schema change tool warns explicitly that all database tools carry risk and that you should test on a non-production server and verify backups before running it (Percona). A checklist line that demands the rehearsal output turns that warning into a gate.

For MySQL shops the reviewer should also confirm the chosen strategy, since Vitess recommends its managed, online schema changes over unmanaged ones (Vitess). The reviewer's question is not which tool is better; it is whether the chosen tool was actually used for this table.

Testing the template against a past incident

Take the most recent release that caused an incident, and walk the checklist backwards. For every line, ask whether the answer at the time would have been a fail. If the truthful answer was "pass," the line is decorative and should be rewritten or deleted.

Work a worked example. Suppose an incident occurred because a migration added a column with a volatile default, which rewrote a large table under an exclusive lock during peak traffic. The rewrite held the lock for the whole operation (DBGorilla). Replay the template:

Checklist lineTruthful answer at the timeWould it have blocked the release?
Does the migration set a lock_timeout before the first DDL?, evidence: migration fileNoYes
Does the change add a column with a default?, evidence: diffYes, volatileFlagged for review, not blocked
What lock does each statement take and for how long?, evidence: vendor lock tableACCESS EXCLUSIVE, whole rewriteYes
What is the rollback command and how long does it take?, evidence: rehearsal outputNone runYes

Three of four lines would have blocked the release. The second line, as written, would not, because it only flags for review. That line should be rewritten to demand the answer to a follow-up: is the default constant or volatile, and if volatile, is the table under a size threshold that makes the rewrite acceptable? A checklist improves by this loop, one line at a time.

Run the exercise on a second incident to test whether the template generalizes or whether it has been overfitted to the first. If the second pass produces only decorative lines, the template needs a new category, not more lines.

The agent operator's checklist is the one you are missing

Most teams now have a third role in the review, even if they have not named it: the person who runs the agent that wrote or executed part of the change. That role needs its own short list, because an agent's failure modes do not appear in a code diff.

The operator's lines should cover identity, scope and evidence. Every agent should have a unique ID and a named owner (Hatchworks). The tools it called on this task should be on an allowlist, and the log should show it. Anything irreversible, such as sending an email or deploying to production, should have a named approver, and the operator should be able to show that the approval happened before the action (Viktor).

Then there is the question of whether the agent's work can be reconstructed. If you cannot open the action log for a given run and read the steps in order, the operator cannot sign off on the change. That line is testable, and it fails loudly.

Where the operator needs a way to reproduce what an agent did, a single interface across model types helps. Quanta Inference puts text, image, video, audio and embedding models behind one API key, so the operator can replay a run against the same model family with the same credentials, rather than chasing five provider dashboards.

Keeping the list alive

A checklist that never changes is a checklist nobody reads. Give it a maintenance rule: any incident adds at most one line, and any line that has passed without a fail for a full quarter is a candidate for removal. Roussy's advice to do a first pass for context and a second pass against the list only works if the list is short enough that a second pass is realistic (Marc Roussy).

The review practice literature is consistent about this. Catalina Turlea's review notes treat repetition and small improvements as recurring, concrete flags rather than open questions (Catalina Turlea). That is the register a good checklist should be in: specific, checkable, and boring.

When the template needs to spread across a team, the first step is usually a shared library of the checks themselves, so an agent can run the mechanical lines and leave the judgment lines to the reviewer. Quanta Skills is the skill library for that job; you can install a skill into a coding agent or put an expert on the line of business.

FAQ

FAQ

What is the difference between a review checklist and a review rubric?

A checklist asks yes or no questions that can be answered from an artifact. A rubric assigns a score or a quality level. Use the checklist for gates, where a fail blocks the release, and keep the rubric for retrospective quality discussions. Mixing them produces a list that neither blocks nor instructs.

How many lines should a second reviewer's checklist have?

Keep it to five or fewer, and make every line unanswerable by reading the diff alone. The second reviewer's lines should cover intent, blast radius and rollback. If a line can be answered by the author in the pull request template, move it to the author's list.

What if the reviewer does not know the answer to a technical line?

They ask the author to produce the evidence. The line should name the artifact source, so the reviewer's job is verification, not recall. If the artifact cannot be produced, that is a fail, not an open question. This is why lines must name an evidence source rather than a topic.

Should the agent operator be a separate person from the author?

Ideally yes, and always for changes that touch production or irreversible actions. The operator cares about tool scope, retry behavior and the action log, and those questions are easy to skip when the same person is also defending the code. If one person must hold both roles, at minimum require the action log to be attached to the review.

How do I know when to retire a checklist line?

When it has passed without a fail for a full review cycle, promote it to an automated check or remove it. Lines that never fail are either already covered by tooling or decorative. Retiring them keeps the list short enough that a second pass is still realistic, which is the only way a checklist keeps working.

Sources

Sources

  1. Checklist for code review process - The Turing Way
  2. Ultimate Code Review Checklist - Marc Roussy
  3. Schema changes and the Postgres lock queue
  4. PostgreSQL: How a 1ms ALTER TABLE Can Freeze Your ...
  5. AI Agent Security Checklist: Identity, Least Privilege, ...
  6. How to Evaluate an AI Agent: 8-Question Checklist (2026)
  7. Which ALTER TABLE statements lock a PostgreSQL table?
  8. When Postgres blocks: 7 tips for dealing with locks
  9. pt-online-schema-change - Percona Toolkit Documentation
  10. Making Schema Changes - The Vitess Docs
  11. The Checklist of my Code Review Practice
About the author

About the author

Antonio Evans
Antonio Evans

Antonio Evans is the founder of Quanta Intelligence and a fractional CTO who builds HIPAA-ready AI systems for health and life-science companies. Before that he was technical co-founder of FriendsEAT for twenty years, CEO of Socialdraft, and a data engineer at IBM. Antonio lives with his dog Santino in Lisbon, Portugal.

All articles