Development

Writing Checklist Lines a Model Can Score Automatically

Antonio Evans8 min read

A printed checklist where each row is a question with yes, no and not applicable checkboxes sits beside a laptop showing the same rows as JSON with quoted evidence, and a hand with a pen marks one row as a disagreement.
Key points

Key points

  1. 1Rewrite each review checklist line as a closed question with exactly three permitted answers (yes, no, not applicable) so a model can score it without interpretation.
  2. 2Require the judge to quote the source text behind every answer, which turns a subjective opinion into an auditable record.
  3. 3Split any line that bundles two judgments into two lines, because mixed criteria produce answers no one can verify.
  4. 4Run the model as a pre-screen and route only disagreements, low-confidence rows and "not applicable" answers to a human reviewer.

Why a vague checklist line defeats an automated judge

Most review checklists are written for a human who already knows the codebase. A line like "Is the logging sufficient for production debugging purposes?" works for an experienced reviewer and fails for a model, because "sufficient" has no shared definition between the person who wrote it and the scorer reading it. The Turing Way's reviewer checklist openly acknowledges this: its items are "a source of inspiration" and the reader is asked to judge "to what extent the item mentioned is implemented," which is a spectrum rather than a verdict (The Turing Way). That framing is fine for a colleague and unusable for a machine.

Checklist culture exists precisely because memory is unreliable. Marc Roussy, writing about code review checklists, compares them to the lists pilots run through before every phase of a flight: the point is not that the pilot has forgotten how to fly, it is that a list "makes sure that each item has been addressed" (Marc Roussy). A model has the same need in reverse. It will address an item whether or not the answer is grounded, so the list has to constrain what counts as an answer.

The research on rubric-based grading points the same way. A systematic review of automated grading for open-text legal answers found that "a rubric written for the task is the strongest lever for agreement between an LLM judge and human graders," and that rubric-centered grading is the most auditable approach because it makes "the standard, its application and the final decision checkable" (SoK: Grading Open-Text Legal Answers). Your checklist is that rubric. The work is converting it into a form where the standard is explicit enough to check.

The yes / no / not applicable pattern

Take any imperative or open-ended checklist item and ask what the reviewer would have to see to mark it wrong. If you cannot answer that in one sentence, the line is not ready for a judge.

Current lineProblemRewritten as a closed question
"Ensure tests are reliable and flaky tests are fixed"Two judgments, no threshold"Does every test in the changed files have a deterministic assertion on a fixed input?" (yes / no / not applicable)
"Are credentials never logged?"Negation is hard to score"Does any log call in the diff include a value read from an environment variable holding a secret?" (yes / no / not applicable)
"Is the code testable?"Spectrum, no evidence rule"Is every external dependency in the changed code injected through a parameter rather than constructed inline?" (yes / no / not applicable)
"Naming should be clear"Purely subjective"For each new public function, does the name describe the outcome rather than the mechanism?" (yes / no / not applicable)

Two rules make this work in practice. First, one question per line. The Turing Way list separates style, tests, security, and legal requirements into distinct sections, which is the right instinct: a reviewer who checks tests and security in one pass conflates them, and so does a judge (The Turing Way). Second, an explicit escape hatch. "Not applicable" is not a cop-out; it is the answer that flags scope. A migration file has no HTTP input validation, so a security line about input handling should return not applicable and never yes. Without that third option, judges tend to manufacture a yes to satisfy the prompt.

A checklist line is ready when a second person, given only the line and the diff, reaches the same answer independently. Test this on twenty past pull requests before you build anything.

Writing the answer schema so output is scorable

Give the judge a fixed output shape. Free prose responses are readable and useless for counting. Ask for a short structured record per line, one record per checklist item:

{
  "line_id": "tests.assertions_deterministic",
  "answer": "yes | no | not_applicable",
  "evidence": "quoted text from the diff that the answer relies on",
  "confidence": 0.0
}

The evidence field is the load-bearing part. An answer without a quote is an assertion; an answer with a quote is a claim someone can check in seconds. The legal grading review reaches the same conclusion, noting that evidence should be "checked in code" rather than trusted from the judge's prose (SoK). You can enforce this mechanically: reject any record where the answer is "no" and the evidence field is empty or does not appear verbatim in the submitted diff. That single validation catches most fabricated findings.

Confidence needs a source too. If your provider returns token probabilities, use them. If it does not, ask the judge for a three-level certainty (high, medium, low) and calibrate the levels against your own labeled sample rather than trusting the number at face value. LLM-as-a-judge systems are documented to drift between runs and to favor long answers, so the confidence field is a routing signal, not a measurement (survey on LLM-as-a-judge).

A sample prompt skeleton, kept short on purpose:

You are scoring one review checklist line against a code diff.
Answer only yes, no, or not_applicable.
Answer not_applicable if the line's subject does not appear in the diff at all.
Quote the exact diff text your answer relies on. If you cannot quote it, answer not_applicable.
Do not infer intent. Score only what is visible in the diff.

The instruction to score only what is visible is the guard against a judge that reasons about the author's intentions. Judges are also susceptible to instructions embedded in the text they grade, so treat the diff as untrusted input: never let the diff dictate output format (SoK).

Splitting mixed judgments into separate lines

The most common cause of disagreement between a model and a human is a line that hides two questions. "Are tests present and meaningful?" fails a diff that adds a test asserting assertTrue(True). The judge answers "yes, tests present" and ignores meaningfulness. Split it:

  • Does the diff add at least one test file in the project's test directory? (yes / no / not applicable)
  • Does every added test assert on a value derived from the code under test rather than a constant? (yes / no / not applicable)

Now each answer has a distinct evidence trail, and a disagreement points at one specific criterion. This mirrors how the sample checklists in circulation are already structured: the Turing Way separates "do the tests conform to the standards" from "do the tests actually ensure the code is robust in its intended use" (The Turing Way). Keep that separation when you hand the list to a model.

Split until each line can be answered from a single quoted passage. If answering a line requires weighing three parts of the diff against each other, it is still two lines.

Running the judge as a pre-screen, not a verdict

The economics of this pattern are the reason to attempt it. LLM judges agree with human reviewers at reported rates around 85 percent in published measurements, which is a useful pre-screen and a bad final decision (Confident AI on LLM-as-a-Judge). Design the pipeline around that gap.

Worked example. Suppose your team reviews 400 pull requests a week and each one runs 25 checklist lines. That is 10,000 judgments. A human reviewer spends an average of 20 seconds per judgment when the answer is obvious and several minutes when it is not. If the model settles 80 percent of lines without controversy and flags 20 percent, the human queue is 2,000 items, and the reviewer spends their time only where the answers were uncertain or contested. The number that matters is not model accuracy in the abstract, it is how many items reach a human and how many of those turn out to matter.

Three routing rules do most of the work:

  1. Model says no or not applicable, human says yes: send to human, the model may have missed context outside the diff.
  2. Model says yes, human review of a sample says no: this is a judge defect, not a code defect. Fix the line wording or the prompt before sending more to review.
  3. Confidence is low on either side: route to human regardless of agreement.

Repeated runs on the same input also help. Run the judge twice and compare the two sets of answers; disagreements between two runs of the same model on the same diff are the clearest signal that a line is ambiguous and needs rewriting (survey on LLM-as-a-judge).

Track two numbers from the start: human overturn rate on flagged items, and escape rate, meaning defects a human later found in lines the model passed. If the escape rate stays near zero across a few hundred pull requests, you can widen autonomy. If not, the checklist is the problem, not the model.

When the reviewers cannot keep pace, running several model families behind a single API key removes the integration overhead of comparing judgments. Quanta Inference exposes text and embedding models through one OpenAI-compatible endpoint, which is the practical way to test two judges against each other before you pick one: https://quantaintelligence.ai/inference

Checklist items that resist automation, and what to do with them

Not everything converts. Some lines are judgment calls whose value lies in the discussion they provoke, and automating them produces confident noise. Sort your list into three buckets before writing any prompt.

BucketSignalTreatment
DeterministicAnswer follows from the diff text alone, e.g. secrets in logs, missing assertions, hard-coded URLsAutomated, evidence required, no human unless flagged
Evidence-based but interpretiveRequires reading intent, e.g. "does this abstraction earn its complexity"Automated pre-screen, human always reads the quote
Genuinely openDepends on product context, roadmap, or tasteKeep human, do not convert

The AI agent security literature offers a useful model for the middle bucket. A vendor evaluation checklist for agents asks buyers to demand a named person approves irreversible actions and to look for an action log an admin can open, which is the same evidence-first posture applied to a checklist (Hatchworks). An agent that changes production data needs a log a human can reconstruct; a checklist line that says "no" needs a quote a human can open. The pattern is identical: make every automated claim checkable by someone who was not there when it was made.

Leave the open bucket alone. Converting every line is a common failure mode, and it produces a checklist that scores everything and catches nothing.

Keeping the checklist honest over time

A checklist that is never revised drifts away from the codebase. The judge makes this visible, because every line now has a history of answers, overturns, and disagreements. Review that history on a schedule.

Watch for three patterns. A line whose answer is "yes" on every pull request for a month is either always satisfied (retire it) or too easy to satisfy (sharpen it). A line with a high disagreement rate is ambiguous (rewrite it). A line whose evidence quotes are always outside the diff is being answered from context the reviewer did not provide (add the context or drop the line).

Assign ownership. A checklist without an owner decays into a list of things nobody checked. Quartely, or after any incident where a review missed something, run the failing change through the checklist as a judge would and see which line should have caught it. If none did, that is a new line. If one did and the model answered yes, the line needs a sharper test.

FAQ

FAQ

How many answers should each checklist line allow?

Three: yes, no, and not applicable. Yes and no force a verdict, and not applicable keeps the scope honest when the line's subject does not appear in the reviewed change. Adding a fourth "partially" option invites the judge to hedge, and partial credit makes routing decisions impossible. If you find yourself wanting "partially," the line is really two questions.

Do I need to fine-tune a model to score checklists?

Usually not. A well-written rubric is the strongest lever for agreement between an LLM judge and human graders, according to a systematic review of rubric-based grading (SoK). Start with a strong general model, a fixed output schema, and an evidence requirement. Fine-tune only after you have a few hundred labeled disagreements showing a consistent error pattern that prompt changes cannot fix.

What do I do when the model and the reviewer both say the line is not applicable?

Trust it, but log it. A line that returns not applicable across a large share of changes is scoped too narrowly for your codebase. The fix is to rewrite the line for the cases that actually occur, or retire it. Do not let a line accumulate not-applicable answers indefinitely; it is consuming prompt space and reviewer attention for nothing.

How do I stop the judge from being talked into an answer by the diff?

Treat the diff as untrusted input. Instruct the judge to score only what is visible, and validate that every quoted evidence passage appears verbatim in the submitted change. Judges are documented to obey instructions embedded in the text they are grading, so prompt-injection resistance has to be enforced in code around the model, not only in the prompt (SoK).

Should the judge see the reviewer's answer before scoring?

No. Score independently and compare afterward, because showing the human answer first invites anchoring and the comparison loses its value. Once both answers are in, route any three-way disagreement to a human. Two independent runs on identical input are also the cheapest way to spot an ambiguous line (survey on LLM-as-a-judge).

Sources

Sources

  1. Checklist for code review process - The Turing Way
  2. Ultimate Code Review Checklist - Marc Roussy
  3. SoK: Grading Open-Text Legal Answers, from Law School ...
  4. A survey on LLM-as-a-judge
  5. LLM-as-a-Judge Simply Explained: The Complete Guide to ...
  6. AI Agent Security Checklist: Identity, Least Privilege, ...
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