The useful mental model is a three stage assembly line: an agent produces output, a machine reviewer inspects it against a rubric, and a person makes the final call. Each stage has a different job, and the second stage exists for exactly one reason: to make the third stage cheaper without making it dumber.
That framing matters because machine review is not free of cost or risk. Research on LLM judging shows that model assessments are sensitive to prompt phrasing, label order, response length and position, and that models tend to favor their own generations in the rubric study. A reviewer with those biases placed directly in front of a person will either bury that person in noise or, worse, train them to rubber stamp.
So define the contract before you write the prompt. The reviewer returns one of three verdicts, not a score:
| Verdict | Meaning | Route |
|---|---|---|
| Block | A specific rubric item failed and the failure is mechanical or policy relevant | Return to the agent with the failing item named |
| Pass | Every checkable rubric item passed | Human queue, top of the stack |
| Escalate | The output is checkable but the reviewer cannot decide | Human queue, flagged for judgment |
The distinction between Block and Escalate is the whole design. Block is for things a human would never approve as written: a missing field, a broken schema, a citation pointing at a URL outside the allowlist. Escalate is for anything requiring taste, context or domain judgment. If your reviewer cannot explain which verdict it picked and why, it is not ready.
One caveat from the code review world applies directly: Google's review standard says reviewers should favor approving a change once it definitely improves overall code health, even if it is not perfect, because there is no perfect code, only better code in the Google engineering practices. A machine reviewer that demands perfection will block almost everything and get switched off within a week. Write your rubric to the same standard: block on defects, not on taste.



