You connect your tool server to an agent, give it a task, and it works. You run it again for a friend, and it works again. Does that mean it really works? In 2024, the authors of τ-bench ran agents through tasks where an agent talks with a user, follows a company’s rules, and changes a database. Even “state-of-the-art function calling agents (like gpt-4o) succeed on <50% of the tasks”, and in the retail domain, the chance of succeeding on all eight tries of the same task was under 25%19. This chapter is about the distance between “it worked” and “it works”.
Section 8.1
Four levels: where a run can go wrong
Start with one tool from CMU’s lecture: create_grocery_cart(items). The user says “Make a cart with bananas, milk, and coffee.” The model calls the tool with those three items, the tool returns “Cart C17 · 3 items · $31.42”, and the model tells the user it created a three-item cart for $31.421.
That process can go wrong in four places.
- Selection. The model might reply “Done!” without calling any tool, or it might call
search_webinstead. The question here is “Right tool?”, and the typical failure is a “Missing or extra call”1. - Arguments. The model might call the right tool but with
["bananas", "milk"]. The question is “Right values?”, and the typical failure is a “Wrong field or value”1. - Trajectory. Consider a bigger task: check stock, then build the cart. The model might build the cart first. Each call might be correct on its own, but the order is wrong. CMU’s question is “Right order?”, and the failure is a “Bad dependency”1.
- Task. All calls might be correct, but then the model tells the user the cart costs $13.42. The question is “Goal achieved?”, and the failure CMU names is a “Plausible wrong answer”1.
CMU calls this table “Evaluate the whole stack” and gives each level its own example metric: precision and recall for selection, an AST (abstract syntax tree) or schema match for arguments, sequence success for the trajectory, end-to-end success for the task1. An AST match parses the call the model wrote and compares its structure with the call you expected. Look at the column that asks whether you need to execute anything. For selection and arguments the answer is no; for the trajectory it is “Usually”; for the task it is yes1. You can grade the first two by comparing the call the model wrote with the call you expected, without touching a real system. Berkeley’s function-calling leaderboard does exactly this when it cannot run a call: “Ideally one should use execution evaluation, but when we evaluate the answers, not all the results are easily executable (e.g., Java functions). So we use the AST as a complement to the execution evaluation.”2
Two things follow from this. First, the levels hide each other. If the model never calls the tool, you have no arguments to grade and no trajectory to follow. A selection failure then looks like a task failure unless you record it separately. Second, one end-to-end score cannot tell you which level broke. Chapter 3’s four gates (valid, correct, safe, done) described what a single call can be; these four levels tell you where in a run to look.
Check yourselfThe model calls create_grocery_cart with bananas, milk and coffee, gets back “Cart C17 · 3 items · $31.42”1, and tells the user the total is $13.42. Which level failed?
The task level failed. Selection and arguments were correct; the final answer is a “Plausible wrong answer”1. A grader that only checked the call would mark this run as a pass.
Section 8.2
Where agents fail
Chapter 3 quoted MCP-Atlas’s three largest failure categories to show that deciding to act, not getting the format right, is the hard part. Here is the whole picture, because it tells you where to put your logging.
MCP-Atlas has 1,000 tasks on 36 real MCP servers with 220 tools, and its prompts “avoid naming specific tools or servers, requiring agents to identify and orchestrate 3-6 tool calls across multiple servers”3. It scores each task with “a claims-based rubric that awards partial credit based on the factual claims satisfied in the model’s final answer”3. Then it sorts the failures. Averaged across the models it tested, “No tools called” is 36.0% of failures and “Partial task completion” is 25.8%; incorrect tool parameters are 14.2%, response quality 8.5%, missing tool calls 6.5%, flawed reasoning 3.5%, skipped steps 3.0%, misunderstood task 1.5%, and other 1.0%3. The authors’ own summary: “primary failures arising from inadequate tool usage and task understanding”3.
Now put these categories on the four levels. The mapping is ours, not the paper’s. Failures like ‘no tools called’ and ‘missing tool calls’ are selection failures. ‘Incorrect tool parameters’ is an arguments failure. ‘Skipped steps’ is a trajectory failure. ‘Partial task completion,’ ‘misunderstood task,’ and ‘response quality’ are task-level failures. When we look at it this way, about four out of ten failures involve a tool that should have been called but wasn’t. Only about one in seven failures is due to a wrong value. If your logs only record whether each tool call parsed, you will miss most of what goes wrong.
Hold this split loosely. It comes from one benchmark, with its specific task design and its own judge, averaged across models. Its public leaderboard was later re-scored: in April 2026, Scale upgraded “the scoring judge and adding retry handling for transient tool errors” and replaced the 20-turn limit with “a tool call budget of 100 max tool calls per task”4. Use this split as an example of where failures can cluster, not as a definitive law.
CMU adds a second way to sort failures: by who failed. The model can pick the wrong tool, pass bad arguments or ignore the result; the harness can fail to parse, authenticate, validate or match an ID; the provider or tool can time out, hit a rate limit or throw an execution error1. The slide’s conclusion: “Production evaluation needs benchmark accuracy and operational failure rates.”1 Benchmarks mostly score the model’s share. Your own server will add harness and tool failures, so log them too. CMU’s slide also charts tool-call error rates by provider1. OpenRouter’s public rankings page, as fetched in October 2026, lists “Tool usage across models on OpenRouter”5, but we could not confirm the per-provider error figures there, so this book does not repeat them.
Check yourselfYour tool times out. The model reads the timeout message and tells the user, ‘Your order is placed.’ Who failed, and at which level?
Two things went wrong. The tool failed first; a timeout is a provider or tool failure. Then, the model ignored the result, which CMU lists as a model failure1. The user sees a task-level failure: a plausible wrong answer. Logging only the final answer would hide both causes.
Section 8.3
The benchmark landscape
You will see these names in papers and model announcements. This section maps what each family gives an agent and how it grades agents. It is not a leaderboard.
- BFCL, the Berkeley Function Calling Leaderboard. Its versions build on each other: “BFCL-v1 introducing AST as an evaluation metric, BFCL-v2 introducing enterprise and OSS-contributed functions, BFCL-v3 introducing multi-turn interactions, and BFCL-v4 introducing holistic agentic evaluation.”6 V1 grades single-turn calls of four kinds (simple, multiple, parallel, parallel multiple) by AST match or by execution2. V2 adds live, user-contributed functions to fight data contamination; an average entry offers 3 functions to choose from and the largest offers 377. V4’s web-search part has 100 multihop questions answered with a search API and a page fetcher8. The early versions sit mostly at selection and arguments; the later ones reach the trajectory and the task.
- MCP benchmarks. These connect agents to real MCP servers. MCP-Bench uses 28 live servers with 250 tools and grades “tool-level schema understanding and usage, trajectory-level planning, and task completion”9. MCP-Atlas is the one from the previous section3. MCP-Universe spans 6 domains and 11 servers with execution-based evaluators, including “dynamic evaluators that automatically retrieve real-time ground truth for temporally sensitive tasks”; GPT-5, the best of the models its abstract names, scored 43.72%10. LiveMCPBench has 95 daily tasks over 70 servers and 527 tools, and found “retrieval errors account for nearly half of all failures”11. MCPVerse puts more than 550 tools in front of the model, an action space over 140k tokens12. MCPMark has 127 tasks that involve “a broad range of create, read, update, and delete (CRUD) operations”, each checked by “a programmatic script for automatic verification”13.
- The ToolBench line. ToolLLM collected 16,464 real RESTful APIs in 49 categories from RapidAPI Hub and had ChatGPT generate instructions and solution paths (2023)14. In 2024, StableToolBench reported “a notable decline in the performance of all methods over time, which raises concerns about the stability of ToolBench as a benchmark”, and replaced live APIs with a virtual API server15. The lesson: when a benchmark calls live services, the services change underneath it.
- Coding benchmarks. SWE-bench has 2,294 problems from real GitHub issues in 12 Python repositories; in 2023 the best model, Claude 2, solved “a mere 1.96% of the issues”16. Anthropic notes that LLMs “have progressed from 40% to >80% on this eval” (the Verified subset) “in just one year”17. Terminal-Bench reports a “Resolution rate of Terminal-Bench 4.0 tasks ± 95% confidence interval”, and every row names both a model and an agent; in October 2026 the top row was GPT-6 Astra (max) with Codex at 58.2% ± 2.8%18.
When you read any of these numbers, ask four questions. Which level does it grade? Who wrote the tasks, and is the grader a script or a model? What setup produced it? When was it measured? The next two sections explain why the third and fourth questions are so important.
Check yourselfA model announcement says ‘state of the art on an MCP benchmark’. What do you need to know before this claim means anything to you?
You need to know: which benchmark, and so which levels it grades; how it grades (a script, a rubric, or a model judge); the setup (calling mode, harness, budget); the date or version; and whether the number is one run or several. MCP-Atlas’s own scores changed when its judge and budget changed4.
Section 8.4
Reliability under repetition
Run the same task twice with the same tools and the same database. Why would the result differ? Because the model samples its words. τ-bench says so directly: “for the same task, the user prompt and database transitions are the same, with just the LM sampling of the user and agent messages generating sufficient stochasticity”19. Stanford’s lecture asks the plain version of the question: “Do agents produce the same outcome when given the same task twice?”20
So, you run each task k times. We can summarize these k trials in two ways.
- pass@k asks if at least one of the k trials succeeded. This measures whether the agent can do the task.
- pass^k (read “pass hat k”) asks if all k trials succeeded. τ-bench introduced this metric, “defined as the chance that all k i.i.d. task trials are successful, averaged across tasks”19.
At k = 1 the two are the same number, the plain average success rate: τ-bench reports “pass^1=pass@1=E[r]=E[c/n]” as its main metric19. As k grows, they split. Here is a worked example of our own. Suppose an agent succeeds on a task 80% of the time, and each try is independent of the others. The chance that at least one of k tries succeeds is 1 − 0.2^k; the chance that all succeed is 0.8^k.
| k | pass@k | pass^k |
|---|---|---|
| 1 | 0.80 | 0.80 |
| 2 | 0.96 | 0.64 |
| 4 | 0.998 | 0.41 |
| 8 | 0.99999 | 0.17 |
The same agent can appear almost perfect by one measure and unreliable by the other. Which measure you need depends on the job. If a person will review several attempts and choose a good one, pass@k is appropriate. If the agent runs unattended every day, the job requires pass^k.
The published numbers follow the same shape. On MCPMark the best model, gpt-5-medium, “reaches only 52.56% pass@1 and 33.86% pass^4”, while claude-sonnet-4 and o3 “fall below 30% pass@1 and 15% pass^4”13. The HAL reliability dashboard evaluated 15 agents on two benchmarks and found “recent capability gains have yielded only small improvements in reliability”; in its words, “The gap between capability (pass@k) and reliability (pass^k) is substantial across all models.”21 It also found a “what but not when” pattern: agents “reliably select similar action types across runs but vary in execution order”21. In the four-level language, the trajectory is where repeated runs drift.
Repetition is one kind of stress; small changes to the task are another. ReliabilityBench tested Gemini 2.0 Flash and GPT-4o with ReAct agents and Reflexion agents (which add a reflect-and-retry step) over 1,280 episodes. Agents at “96.9% pass@1 at ε=0 drop to 88.1% at ε=0.2”, where ε sets how strongly the task is perturbed, and among injected faults “rate limiting faults cause the largest impact”22. Chapter 6 discusses what a timeout or a retry does to a write.
Check yourselfYour agent succeeds on a task in 9 runs out of 10. It will run that task 20 times a day, unattended. How worried should you be?
You should be quite worried. For illustration, if trials are independent with a 0.9 success rate, the chance that all 20 succeed is 0.9^20, about 0.12. A 90% pass@1 still means a failure on most days. The τ-bench numbers show the same drop on real tasks: under 25% pass^8 in retail19.
Section 8.5
The setup is part of the result
The Berkeley leaderboard snapshot last updated on 2026-04-12 lists Claude-Opus-4-5-20251101 twice6. In the row marked “(FC)”, the model calls tools through its native function-calling API, and its overall accuracy is 77.47, rank 16. In the row marked “(Prompt)”, the tools are described in the prompt instead, and the same model scores 33.47, rank 576. Same model, same snapshot, more than 40 points apart.
The page does not explain this gap6. Chapter 3 showed that each model family writes tool calls in its own wire format. One plausible interpretation is that native mode lets the model use the format it was designed for. This is our interpretation, not one stated by the leaderboard. The lesson is clear without inference: a score belongs to a model in a specific setup, not just to the model itself.
Other parts of the setup also change scores.
- The format of the prompt. Berkeley’s format-sensitivity study tested 39 models on 26 prompt variations23. When models had to return calls in XML instead of Python or JSON, “even large LLMs (watt-tool-70B, claude-3.7-sonnet) show significant performance drops”23. For the format of the function documentation, “performance is highest with functions in JSON format, lower with XML, and lowest with Python”23.
- The wording of the instruction. HAL found that “sensitivity to superficial instruction paraphrasing varies substantially across models”21.
- The harness. Terminal-Bench names an agent next to every model in its table18. MCP-Universe found that “enterprise-level agents like Cursor cannot achieve better performance than standard ReAct frameworks”10.
- The grader and the budget. MCP-Atlas re-scored every model after changing its judge, adding retries for transient tool errors, and switching from a turn limit to a tool-call budget4.
- The date. A live leaderboard “will be updated periodically”6, and services behind a benchmark can drift15.
So, when you record a number, record its setup with it: the model and version, calling mode, harness, prompt and tool formats, grader, budget, k, and date. For your own tool server, this list is also a list of knobs you can intentionally adjust.
Check yourselfTwo blog posts report the same model on the same leaderboard, one at 77 and one at 33. Is one of them wrong?
Not necessarily. On Berkeley’s leaderboard, the same Claude Opus 4.5 snapshot scores 77.47 with native function calling and 33.47 with prompt-based calling6. You should check the calling mode and the snapshot date before you conclude either number is wrong.
Section 8.6
Task done is not the same as safe
A grader that checks only the final answer or the database’s final state tells you if the task was done. It does not tell you how. HarnessAudit, a benchmark that audits the harness instead of the answer, states this clearly: “a run can return a correct, benign answer along a trajectory that accessed unauthorized resources, leaked context to the wrong agent, or triggered irreversible side effects.”24
Its findings are direct. On its overall harness-safety score, “Even the best system reaches only 0.32 overall. Strong task completion does not imply safe execution.”24 The project page does not explain the score’s scale24. “More than 50% of agents commit at least one violation per task”24. Across harnesses, “task completion shows a consistent negative association with safety adherence”24. The violations are not obvious errors: “Agents rarely call obviously wrong tools, but routinely apply seemingly reasonable tools to unauthorized resources.”24 Stanford’s first lecture dedicates a slide to this point, titled “Task Completion ≠ Safety Compliance”20.
Notice where this sits relative to the four levels. Every call in Run B is a reasonable tool with well-formed arguments, and the task passes. A selection grader that compares the calls with an expected list would see one extra read, but nothing in that comparison says the read was forbidden. The problem is which resources the calls touched, and you see it only when you check the trajectory against a policy. That is why CMU lists safety as its own quality dimension, next to the four levels rather than inside them: “Policy · permissions · side effects”, with the instruction to “Test adversarial outputs and consequential actions.”1
For your own experiment, this means two things. Log what each call touched, not just what it returned. Also, grade at least one property of the trajectory, such as never reading another customer’s record, in addition to the outcome. Chapter 6 discusses the gates that should prevent such calls; this section focuses on noticing them during measurement.
Check yourselfYour grader checks the database after each run, and the correct refund is always there. What else could be wrong?
The trajectory. The agent might have read unauthorized records, passed context to the wrong place, or caused a side effect elsewhere, all while still returning a correct answer24. An outcome check cannot detect any of these issues.
Section 8.7
Experiments, not scores
CMU’s first assignment includes a small experiment. Students give a chess-playing agent one of two observations: the board alone, or the board plus the list of legal moves. They run each observation with two models26. For each of the four runs, they record “total play_move calls, calls rejected as illegal, invalid-move rate, and whether game_over: true was reached”26. Then comes the crucial line: “You are graded on the experiment and evidence, not on a particular result or winning the game.”26
This is the shift this chapter asks you to make. A score answers “how good is it?” An experiment answers a narrower question: what changed when I changed this one thing, and why?
Start with a few words from Anthropic’s guide to agent evaluations. “A task (a.k.a problem or test case) is a single test with defined inputs and success criteria.”17 “Each attempt at a task is a trial. Because model outputs vary between runs, we run multiple trials to produce more consistent results.”17 The outcome is what happened in the world, not what the agent said. A flight-booking agent might announce at the end of the transcript that the flight is booked, “but the outcome is whether a reservation exists in the environment’s SQL database.”17
OpenAI’s evaluation guide names a habit to avoid: “Vibe-based evals”, which treats “it seems like it’s working” as your evaluation strategy25. It then lays out five steps: define the objective, collect a dataset, define metrics, run and compare, and keep evaluating25. (The page also says OpenAI’s hosted Evals platform is “scheduled to shut down on November 30, 2026”; the method does not depend on it25.)
One more warning before we get to the recipe. Graders can be wrong. Anthropic reports that Opus 4.5 “solved a τ2-bench problem about booking a flight by discovering a loophole in the policy”17. The run failed the evaluation as written, yet it “actually came up with a better solution for the user”17. Read the transcripts of failed trials. Sometimes the failure is in your grader.
For your Studio tool server, the recipe looks like this.
- Ask one question. For example: does adding an example call to the tool description reduce argument errors?
- Fix a task set. Use the same tasks for every condition. Each task needs an outcome you can check in the system’s state.
- Change one thing per condition. You will have a baseline and two variants. If you change the description and the model together, you cannot say which one mattered.
- Run several trials of every task in every condition. Report pass^1 and pass^k side by side.
- Record every failed trial by level and by source. These levels are selection, arguments, trajectory, or task; the sources are model, harness, or tool.
- Read the failures, then compare. Did the change move failures from one level to another, or remove them? With ten tasks and a few trials, a difference of one or two tasks can be noise; say so when you report it.
Check yourselfA teammate edits a tool’s description. They run the task set once, and the score goes from 7 out of 10 to 8 out of 10. They want to ship the change. What do you ask for?
Before you go on
Close the book
- Design a three-condition experiment for your Studio tool server. Name the single change you make between conditions. Describe the task set and how many trials each task gets. For every failed trial, state what you record. Which number would make you keep the change?
- Explain pass@k and pass^k to a classmate without looking them up. Then, calculate pass^3 for an agent that succeeds 90% of the time on each independent try.
- Find a tool-use benchmark number in a recent model announcement. Write down the level it grades. List every part of the setup you would need to know before comparing it with another number.
Chapter eight · quiz
Test yourself
Most questions have more than one right answer, so select every option that is true. Check each question, then open “Answer and why” for the reasoning.
Sources
- Tool Use for Language Model Agents (Lecture 2 slides). CMU LTI / Graham Neubig. www.cmu-agents.com/slides/lecture-02-tool-use.pdf ↗
- Berkeley Function-Calling Leaderboard (BFCL V1 blog). UC Berkeley Gorilla project (Yan, Mao, Ji, Stoica, Gonzalez, Zhang, Patil). gorilla.cs.berkeley.edu/blogs/8_berkeley_function_calling_leaderboard.html ↗
- MCP-Atlas: A Large-Scale Benchmark for Tool-Use Competency with Real MCP Servers. Scale AI. arxiv.org/abs/2602.00933 ↗
- Scale Labs Leaderboard: MCP Atlas. Scale AI. labs.scale.com/leaderboard/mcp_atlas ↗
- OpenRouter Provider Analytics. openrouter.ai ↗
- Berkeley Function Calling Leaderboard (BFCL) V4. UC Berkeley Gorilla project. gorilla.cs.berkeley.edu/leaderboard.html ↗
- BFCL V2 • Live Dataset (blog). UC Berkeley Gorilla project. gorilla.cs.berkeley.edu/blogs/12_bfcl_v2_live.html ↗
- BFCL V4 - Agentic Part 1: Web Search. UC Berkeley Gorilla project. gorilla.cs.berkeley.edu/blogs/15_bfcl_v4_web_search.html ↗
- MCP-Bench: Benchmarking Tool-Using LLM Agents with Complex Real-World Tasks via MCP Servers. Wang et al. (Accenture). arxiv.org/abs/2508.20453 ↗
- MCP-Universe: Benchmarking LLMs with Real-World MCP Servers. Luo et al. (Salesforce AI Research). arxiv.org/abs/2508.14704 ↗
- LiveMCPBench: Can Agents Navigate an Ocean of MCP Tools?. arXiv (Mo et al., ICIP-CAS). arxiv.org/abs/2508.01780 ↗
- MCPVerse: An Expansive, Real-World Benchmark for Agentic Tool Use. arXiv (Lei et al.). arxiv.org/abs/2508.16260 ↗
- MCPMark: A Benchmark for Stress-Testing Realistic and Comprehensive MCP Use. Wu et al.. arxiv.org/abs/2509.24002 ↗
- ToolLLM: Facilitating Large Language Models to Master 16000+ Real-world APIs (abstract). arXiv (Qin et al.; ICLR 2024). arxiv.org/abs/2307.16789 ↗
- StableToolBench: Towards Stable Large-Scale Benchmarking on Tool Learning of LLMs. Guo et al.. arxiv.org/abs/2403.07714 ↗
- Jimenez et al. "SWE-bench: Can Language Models Resolve Real-World GitHub Issues?" ICLR (2024).. arxiv.org/abs/2310.06770 ↗
- Demystifying evals for AI agents. Anthropic. www.anthropic.com/engineering/demystifying-evals-for-ai-agents ↗
- Terminal-Bench. Laude Institute / Stanford. www.tbench.ai ↗
- τ-bench: A Benchmark for Tool-Agent-User Interaction in Real-World Domains. Yao et al. (2024). arxiv.org/abs/2406.12045 ↗
- Stanford CS329Z Lecture 1: Intro to Agentic Systems. Diyi Yang, Michael Ryan, John Yang. web.stanford.edu/class/cs329z/slides/lecture01.pdf ↗
- HAL Reliability Dashboard. Princeton HAL. hal.cs.princeton.edu/reliability ↗
- ReliabilityBench: Evaluating LLM Agent Reliability Under Production-Like Stress Conditions. arXiv. arxiv.org/abs/2601.06112 ↗
- BFCL V4. Format Sensitivity. gorilla.cs.berkeley.edu/blogs/17_bfcl_v4_prompt_variation.html ↗
- HarnessAudit Bench. harnessaudit.github.io. harnessaudit.github.io ↗
- Evaluation best practices. OpenAI. developers.openai.com/api/docs/guides/evaluation-best-practices ↗
- CMU 11-768 Assignment 1: Build an Agent Harness. Weiwei Sun, Saujas Vaduguru et al.. github.com/cmu-agents/assignment-1/blob/main/ASSIGNMENT.md ↗