AI Engineer Summit
November 11, 2026Main stage3 min read

Your Judge Is Hallucinating Too

An agent says it scheduled an email for Tuesday.

Brian KennedyZoomInfoPrincipal Engineer

Day 1 livestream · 6:11:43–6:22:59 on YouTube. The player starts and stops at this session’s boundaries.

Introduction

An agent says it scheduled an email for Tuesday. The judge accepts the step. But the tool result says the Salesforce record creation failed, and the agent does not even have a tool that can send the email. Brian Kennedy opens with this failure because it exposes a second problem beneath agent hallucination: the evaluator can believe the agent's account instead of the evidence.

6:11:43 ↗

The reassuring story beats the failed tool call

At 06:11:43, Kennedy walks through a production-style orchestration pattern at ZoomInfo. Specialized agents research, work with CRM data, and carry out other customer workflows. A judge decides whether a step should be accepted, retried, or stopped.

The initial judge was broadly reusable. That was attractive operationally, but it left the model responsible for recognizing what success meant across many different tasks. In the opening example, creating a task was treated as if it satisfied a promise to schedule an email. The tool's explicit failure did not prevent a fluent success narrative from winning.

Kennedy's team assembled five hundred real production steps, used a larger frontier model to regrade them, and had people review the cases and resolve disagreements. Against that reference set, he reports roughly 65% correctness for the existing judge and 118 false accepts. The failure was not just an occasional malformed response. It was accepting work that had not been done.

6:19:00 ↗

Ask narrower questions about the evidence

One possible response would be to write a custom judge prompt for every workflow. Kennedy rejects that as an expanding maintenance problem. Instead, the team tests a decision model against a fixed set of smaller questions. The input includes the instructions, the tool calls and their results, and the agent's report. The output includes probabilities for accept, redo, and stop, plus seven bounded checks that help explain the disposition and generate useful feedback.

The talk does not enumerate those seven checks in sufficient detail to reconstruct them here. Its architectural distinction is clear: the evaluator should inspect evidence about execution rather than merely assess whether the agent's prose sounds satisfactory.

At 06:19:00, the original email case receives approximately 0% accept, 97% redo, and 3% stop from Jev. Kennedy reports about 0.2 seconds for that decision versus 2.5 seconds for the LLM judge. The team then sets confidence thresholds using the five-hundred-case dataset, routing uncertain cases back to the LLM. Those thresholds belong to this calibration exercise, not a universal recipe for deploying any judge.

A promising offline result is not permission to take over

For about 70% of the reference set, the new approach is confident enough to decide. Within that subset, Kennedy reports that it catches 74 of 82 bad accepts made by the original judge. That is useful evidence, but the next step is shadow mode rather than immediately transferring control.

The shadow evaluation leaves the existing judge in control Original stream, 6:20:30. Both judges inspect the same steps; only the LLM judge controls the workflow.

The shadow run covers roughly 37,000 verdicts. Kennedy reports 728 explicit tool-failure cases, with the existing LLM judge catching 294 and Jev catching 623. In a separate email-step category of 1,081 runs, he reports one catch by the LLM judge versus 876 by the new approach. These numbers describe the categories and comparison shown in the talk. They are not a claim that every disagreement was automatically resolved correctly.

Shadow mode is central to the argument because it lets the team inspect disagreements without making the experimental judge responsible for customer outcomes. Kennedy also reports a tenfold speed improvement and fortyfold cost reduction. Those gains matter, but they sit beside the more consequential question: which failures does the system now notice, and which does it still miss?

Judge the postcondition, not the promise

Kennedy ends with a further direction: explicit postconditions for individual tools. If the action was sending a message, was it delivered? If it was writing a record, does that record exist? The presentation describes this as a next step, not an already completed general solution.

That ending sharpens the opening failure. A judge cannot establish delivery by approving the sentence “I sent it.” Nor does a successful-looking substitute action prove the requested action happened. The evidence has to match the task's postcondition.

His recommended rollout remains deliberately narrow: choose one judgment, turn it into bounded questions, run the alternative in shadow mode, and read the disagreements. The talk is not a proposal to replace one unexamined authority with another. It is a case for making the authority of a judge depend on observable work, then testing that dependence before allowing it to control the next step.

Full transcript 267 timestamped passages

Machine-generated source transcript; recognition errors remain. Timestamps and subtitles use the selected source recording’s clock, not clip-relative time. Section links use cited source moments; sections without a verified moment return to the talk start.

6:11:43>> All right. Good afternoon, everybody. I

6:11:46am Brian Kennedy. I'm an engineer on

6:11:49Zoom Info's Agentic platform.

6:11:52Now, I want to start with showing you

6:11:55something one of our agents wrote. This

6:11:58is a real output from our product. The

6:12:00agent's job was to schedule an email for

6:12:03a customer. And this is what it reported

6:12:06back. It [clears throat] said it

6:12:08scheduled the email. It queued it up and

6:12:09that it was going to go out on Tuesday.

6:12:12We don't just trust the agent, though. A

6:12:14second model checks the agent's work.

6:12:16I'm going to call this one the judge.

6:12:18The judge read this and it accepted it.

6:12:21Great.

6:12:23Now, here's the problem. And this is

6:12:25what it actually happened there. Uh,

6:12:28these are the tool results. The record

6:12:30of what actually ran when the agent

6:12:32called the tools. I'm going to call

6:12:33these the receipts. The agent tried to

6:12:36create a record in Salesforce and it

6:12:37failed. The error message that came back

6:12:39says the record was not created and it

6:12:42tells the agent not to report a success

6:12:44or even make up a record. We wrote this

6:12:47message ourselves for exactly this

6:12:49situation. The agent tried again. It

6:12:52created a task which is a to-do.

6:12:55No email was ever scheduled. The agent

6:12:58doesn't even have a tool that can send

6:12:59an email. The agent made it up and the

6:13:01judge approved it. So that's two

6:13:04failures. The agent fabricated a send

6:13:07and the judge rubber stamped it,

6:13:09approved uh a claim that never actually

6:13:12checked. So if you build agents, you

6:13:14probably have run into this and you

6:13:16probably have a judge like this. It

6:13:17might be a code reviewer or a greater of

6:13:19your evals or a supervisor in your loop.

6:13:22Anytime a model decides whether another

6:13:25model's work is good, this can happen.

6:13:28But for the next 10 minutes, I'll show

6:13:30you how we caught this and what we did

6:13:32about it. First, some quick background.

6:13:35My team at Zoom Info um is called Agent

6:13:39Teams. We announced this last week. Uh

6:13:41it's a multi- aent orchestration layer

6:13:43that lives in Zoom Info's GTM studio. It

6:13:46coordinates a team of specialized agents

6:13:48across a company's systems to run GTM

6:13:51workflows. For example, find companies,

6:13:54research them, write an email, log it

6:13:56into their CRM. Each agent has its own

6:13:58roles and instructions like and tools

6:14:01like Salesforce, HubSpot, Slack. These

6:14:04agents make real uh decisions and take

6:14:07real actions in a customer's systems.

6:14:09They write records and they send

6:14:10messages.

6:14:13Every team and every agent finishes a

6:14:15step. A second model checks its work.

6:14:18That's the judge. And it has three

6:14:20options. To move on, to redo the step,

6:14:24or to stop the job altogether. You've

6:14:26probably heard this called LLM as a

6:14:28judge. It's the same idea as a code

6:14:30reviewer or an eval.

6:14:33Now, the hard part for us is that it's

6:14:36one model and it has to grade every kind

6:14:38of agent that we're running through it.

6:14:40Our customers build their own workflows

6:14:42with any agent and any tool in any

6:14:44order. So the permutations are almost

6:14:46infinite. So the list of jobs for the

6:14:49judge has to grow with it. The judge can

6:14:52tell whether the work was looks

6:14:54finished, but what it can't tell is

6:14:56whether the work was right because that

6:14:58depends on what right means for each

6:15:00job. And we're asking it the same

6:15:03question for all of them.

6:15:06So here's where we're going. First, I'll

6:15:09talk about what we found when we checked

6:15:10the judge.

6:15:13Then what we chose instead and what you

6:15:16can to do today with your own agents.

6:15:21To start, we ran offline evals. We took

6:15:24500 real steps from production, each

6:15:27with a decision that the judge had made.

6:15:30Then we took a larger frontier model and

6:15:31regraded every one of those to come back

6:15:34with an accept or a send back. Then we

6:15:37hand checked each of those samples and

6:15:39we checked the grades where we disagreed

6:15:41with the model. We went with our call.

6:15:44This gave us a reference label for all

6:15:46500 steps.

6:15:49And it turned out the judge was right

6:15:5165% of the time. So more or less a coin

6:15:54flip. It accepted 118 steps that it

6:15:58should have sent back. That's more than

6:16:00one in four of everything that it

6:16:02accepted.

6:16:04Pretty bad. And when we read through

6:16:06those, the most common problem was that

6:16:09similar to the email at the start, the

6:16:12agent reported that it did something

6:16:14like send a message and no tool call had

6:16:17ever done that.

6:16:20So to see why the judge had accepted it,

6:16:22let's go back to the email and look at

6:16:24what the judge was given. On the left,

6:16:26you have what the agent's own summary.

6:16:29Think of it as like a story. It's

6:16:31confident. It's well written. It says

6:16:33the email was scheduled. Now on the

6:16:35right you have the receipts. This is the

6:16:37actual tool results. There are errors

6:16:40failed to create messages uh telling the

6:16:43agent not to make up the record. Now the

6:16:46judge had both of these and it went with

6:16:48the story. The work looked fine on the

6:16:50surface so it accepted it.

6:16:54Now this isn't only our judge. You can

6:16:56think of a code review agent that reads

6:16:59the PR description before it looks at

6:17:01the diff. It's a similar kind of

6:17:02problem. If the description says, "I

6:17:04fixed the bug, added tests," the agent

6:17:07is going to lean on that when it reads

6:17:08the code.

6:17:10So, the obvious fix at the start was to

6:17:12tune the judge and write a better

6:17:14prompt. For us, that was going to be a

6:17:16significant amount of work. Our agents

6:17:18write sales emails, update CRM, do

6:17:20research, and to judge each of these.

6:17:23Well, we'd have to figure out what it

6:17:25was that the user was asking. Give the

6:17:27judge the right rules for every kind of

6:17:30work and keep it all up to date. That's

6:17:33basically a custom judge for every use

6:17:34case.

6:17:36What we went with, we went a different

6:17:37direction. We stopped asking one big

6:17:40general question. Is this good? And we

6:17:42started asking a short list of small yes

6:17:45or no questions. They are the same

6:17:48questions for every step. And each one

6:17:50is small enough to answer by looking at

6:17:52the receipts.

6:17:54The first option here is basically a

6:17:56prompt tuning project that never ends.

6:17:58Whereas the second one is a small

6:18:00handful of small checks.

6:18:03Now to answer those questions, we use

6:18:06Jev. You've heard a lot about Jev today,

6:18:07so I'll skip that and keep that short.

6:18:10It's a tight decision model, not a

6:18:12generative model. Uh for mom at home

6:18:14watching, just ask Claude.

6:18:16and we'll send it structured facts, you

6:18:18know, about the step and a listed a type

6:18:21questions. A typed question is a yes or

6:18:24no question or a choice with from a

6:18:26fixed list of options. It sends back a

6:18:29probability for each answer and it

6:18:31answers all the questions in one call.

6:18:36We gave it four things. the

6:18:37instructions, the uh input, the receipts

6:18:41and meaning every tool call and whether

6:18:43it was successful or it failed and the

6:18:45agents report. Then we asked for one

6:18:48choice which was accept, redo or stop

6:18:52and that choice makes the decision. But

6:18:55then we also ask seven yes or no

6:18:57questions. Those seven questions tell us

6:19:00the why. They decide between a redo and

6:19:03a stop and they go into the feedback

6:19:06that the agent gets when it actually has

6:19:08to redo a step.

6:19:11Now back to the email. The LLM judge

6:19:14accepted it and it took about 2 and a

6:19:16half seconds. Jev gave us a probability

6:19:19for each option. For this step, it

6:19:22accepted 0%. Redo 97% and stop at 3%.

6:19:28And it took about a fifth of a second.

6:19:31We make the decision from the

6:19:33probability of accept. At 30% or higher,

6:19:36we accept that. At 5% or lower, we redo

6:19:40or stop. And anything in between means

6:19:42Jev isn't sure. So, we kick it to an LLM

6:19:44judge. We picked those cuto offs from

6:19:47testing the 500 labels that we had at

6:19:49the beginning.

6:19:52Now, to test whether what whether or not

6:19:54this works better, we took two different

6:19:56routes. The first test used the same 500

6:19:59production steps from the offline eval

6:20:03was confident enough in about seven out

6:20:05of 10 of them. One of those steps uh the

6:20:08LM judge had accepted 82 that should

6:20:11have been sent back. Each red square

6:20:13here is one of those. Jev successfully

6:20:17caught 74 of those. The blue squares are

6:20:19the ones that Jeb would have sent back.

6:20:25Now the second test is what we call

6:20:27shadow mode. Both judges look at every

6:20:30step but only the LLM judge uh that

6:20:33decision counts. So we saved Jev what

6:20:36would have done and we don't let it

6:20:38affect the actual run. That gave us

6:20:4037,000 decisions to mine for insights.

6:20:43And in that time there were 728 steps

6:20:47where a tool had clearly failed. The LLM

6:20:51caught 294 of them. Jev caught 623.

6:20:56And the fake email from the beginning,

6:20:58it wasn't a one-off thing either. The

6:21:00same step ran 1,081 times. And almost

6:21:03every time the agent said it had

6:21:05scheduled an email, the LLM judge only

6:21:07caught it once. Jev caught that 876

6:21:10times.

6:21:14And when you have a judge, every step

6:21:16waits. Jev was 10 times faster and 40

6:21:19times cheaper. At this scale, it is

6:21:22massive.

6:21:25[snorts]

6:21:36or stop. But next we're adding post

6:21:38condition checks which are questions

6:21:40that depend on which tool called uh was

6:21:43within the step. So we don't have to

6:21:45guess. Uh we know the step up front

6:21:47because the tool tells us. If a step

6:21:50called let's say a send tool, we also

6:21:52ask whether the message was delivered.

6:21:54If it wrote a record, we ask whether the

6:21:57record exists. And those go into Jev

6:21:59with the same seven questions in the

6:22:01same call.

6:22:04Now, what can you do today with your

6:22:06agents?

6:22:08First, pick one judgment. Somewhere in

6:22:10your systems, there is an LLM deciding

6:22:12whether or not something is good. It

6:22:14might be reviewing code, grading an

6:22:16eval. Pick one of those and rewrite it

6:22:18as a few simple yes or no questions that

6:22:20can be answered from the evidence.

6:22:23Second is build it. This is the easy

6:22:25part. Honestly, we used Jev and ours was

6:22:27seven questions. Then the third, ship it

6:22:30in shadow mode. run it next to what you

6:22:33already have, but don't let it make the

6:22:34decisions yet. Just save it. Uh, and

6:22:37then you can analyze it later.

6:22:39Then read the cases and see where the

6:22:42two disagree. And don't overthink it.

6:22:44Just start small.

6:22:47We had trusted our judge until we

6:22:48measured it. Measure yours. Run a second

6:22:51check. Run it in shadow mode and see

6:22:53where it disagrees. You may be surprised

6:22:55with what you find. Thank you.