<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:webfeeds="http://webfeeds.org/rss/1.0"><channel><title>Waldek Mastykarz</title><description>Innovation matters</description><link>https://blog.mastykarz.nl/</link><image><url>https://blog.mastykarz.nl/favicon.ico</url><title>Waldek Mastykarz</title><link>https://blog.mastykarz.nl/</link></image><atom:link href="https://blog.mastykarz.nl/feed.xml" rel="self" type="application/rss+xml"/><pubDate>Sun, 18 Oct 2026 10:47:39 GMT</pubDate><lastBuildDate>Sun, 18 Oct 2026 10:47:39 GMT</lastBuildDate><ttl>60</ttl><item><title>If you can&apos;t automate your workflow, neither can your users&apos; agents</title><link>https://blog.mastykarz.nl/automate-workflow-users-agents/</link><guid isPermaLink="true">https://blog.mastykarz.nl/automate-workflow-users-agents/</guid><description>&lt;p&gt;&lt;img src=&quot;https://blog.mastykarz.nl/assets/images/2026/10/rug-revealing-hole.png&quot; alt=&quot;If you can&apos;t automate your workflow, neither can your users&apos; agents&quot; class=&quot;webfeedsFeaturedVisual&quot; /&gt;&lt;/p&gt;&lt;p&gt;Imagine you&apos;re building an eval to test whether an AI coding agent can deploy an application to your cloud platform. You want to verify that the generated application actually works, so you need to provision resources, deploy the code, validate its functionality, and clean up afterward. Sounds straightforward. Until you try to automate it. Some operations require navigating a portal. Authentication involves interactive steps. Provisioning means coordinating several services, each with its own configuration and failure modes. Even telling whether the deployment succeeded isn&apos;t always obvious.&lt;/p&gt;
&lt;p&gt;You could work around these limitations in your eval harness. But consider what you&apos;ve just discovered: &lt;strong&gt;if you struggle to automate your workflow, your users&apos; agents are likely struggling with exactly the same things.&lt;/strong&gt; In that case, the obstacles in your harness are a product problem, and working around them in the harness leaves them in place for everyone else.&lt;/p&gt;
&lt;h2&gt;Agents expose friction we&apos;ve learned to tolerate&lt;/h2&gt;
&lt;p&gt;Many developer workflows were designed around humans. We navigate portals, copy values between screens, interpret error messages, and wait patiently for operations to complete. Over time, we learn the quirks of our tools and develop workarounds. Agents usually don&apos;t have that experience. They need to &lt;a href=&quot;https://developer.microsoft.com/blog/how-ai-coding-agents-actually-use-your-technology/&quot;&gt;discover how to accomplish a task&lt;/a&gt;, reach the functionality it requires, coordinate the operations, and determine whether they&apos;ve succeeded. A workflow that requires manual interaction or undocumented knowledge can stop an agent entirely. And even when every operation is technically accessible, coordinating dozens of steps adds complexity and more opportunities to fail.&lt;/p&gt;
&lt;p&gt;Agents already run infrastructure workflows at scale. In its &lt;a href=&quot;https://www.databricks.com/resources/ebook/state-of-ai-agents&quot;&gt;2026 State of AI Agents report&lt;/a&gt;, Databricks reported that AI agents create 80% of the databases on Neon and 97% of its database branches. As agents become a common way to work with technology, workflows that assume a human operator turn into a problem for more and more of the people who use them.&lt;/p&gt;
&lt;p&gt;Friction also costs money. A human developer might tolerate several minutes of manual configuration during an occasional deployment. Agents, however, run workflows repeatedly, and every unnecessary operation and retry consumes time and inference, as does every round of reasoning the agent repeats along the way. With agents, workflow friction directly increases the cost of completing a task. So a workflow can be technically possible for an agent to execute and still offer poor &lt;a href=&quot;https://developer.microsoft.com/blog/what-is-agent-experience-ax/&quot;&gt;Agent Experience (AX)&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Making a workflow accessible is only the beginning&lt;/h2&gt;
&lt;p&gt;The obvious fix is to expose the functionality through programmatic interfaces such as APIs, CLIs, or MCP tools, so that agents can perform operations without navigating a graphical interface. That&apos;s a valuable improvement, but it leaves the underlying complexity in place. Consider a deployment workflow that requires creating a project, configuring an environment, provisioning infrastructure, assigning permissions, deploying code, and verifying the result. With an API for each operation, the workflow becomes automatable, but the agent still needs to discover and coordinate every step.&lt;/p&gt;
&lt;p&gt;A skill can help by describing the sequence and handling common pitfalls, and it can be a reasonable interim solution. But skills bring dependencies of their own. Users need to find out that the skill exists and install it. Then they need to keep it up to date. You&apos;re betting the usability of your technology on users taking those extra steps. Compare that with a &lt;a href=&quot;/models-better-agent-tools-smaller/&quot;&gt;baseline agent&lt;/a&gt; that discovers and uses your technology through its existing tools and public documentation. When your technology works for that agent, it works for every user who asks an agent for help, including the ones who have never heard of your skill.&lt;/p&gt;
&lt;p&gt;The longer-term opportunity is to simplify the workflow itself. For example, your platform could offer a single operation that handles everything from provisioning to validation, with clear progress information and actionable errors. Rather than teaching every agent how to coordinate a complicated process, you make the process simpler for everyone. And when developers deploy dozens or even hundreds of times a day through agents, improvements in reliability and latency add up, and so do the savings, until they can set your platform apart.&lt;/p&gt;
&lt;h2&gt;Let agents show you where the friction is&lt;/h2&gt;
&lt;p&gt;How do you find the workflows that need attention? Start the same way you would when improving Developer Experience: use your technology yourself, then talk to your users and watch how they work. Pick a common task and ask an agent to accomplish it. Use a &lt;a href=&quot;https://developer.microsoft.com/blog/building-ax-evals-that-actually-work/&quot;&gt;simple, goal-oriented prompt&lt;/a&gt; rather than prescribing the steps. If you&apos;re testing deployment to your platform, name the platform, but let the agent figure out how to use it.&lt;/p&gt;
&lt;p&gt;And watch out for your own expertise! When you know your product inside out, it&apos;s tempting to hand the agent the exact commands and configuration it needs, along with links to the right documentation. It&apos;s easy to steer it, without noticing, around problems that less experienced users would run into. The more product-specific knowledge your prompt assumes, the narrower the audience it represents. &lt;strong&gt;The test is whether the agent can succeed without your help.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Then watch what happens. Where does the agent get stuck? Does it find the right interfaces? Can it authenticate? Does it understand the errors it gets? Does it repeat unnecessary operations? Can it verify that the task is complete? Look beyond outright failures, too. An agent that eventually succeeds after &lt;a href=&quot;/agent-eval-more-than-result/&quot;&gt;dozens of unnecessary tool calls&lt;/a&gt; is still showing you an expensive, inefficient workflow.&lt;/p&gt;
&lt;p&gt;When you find a problem, &lt;a href=&quot;https://developer.microsoft.com/blog/how-to-test-agent-experience-changes-without-shipping-them/&quot;&gt;investigate its cause before you choose a solution&lt;/a&gt;. Sometimes the documentation or error messages need work. Sometimes an API is missing, or the workflow itself needs redesigning. And sometimes the problem &lt;a href=&quot;https://developer.microsoft.com/blog/the-ax-stack-whats-fixed-where-you-can-win/&quot;&gt;lies with the agent or its tools&lt;/a&gt; rather than your product. Understand the friction first, because a new skill or MCP server is only one of the possible answers.&lt;/p&gt;
&lt;h2&gt;Don&apos;t let telemetry hide unmet demand&lt;/h2&gt;
&lt;p&gt;Usage telemetry can help you prioritize improvements, but &lt;a href=&quot;/your-app-is-losing-its-grip-on-your-customers/&quot;&gt;it has a blind spot&lt;/a&gt;. A workflow that agents rarely use looks unimportant. Yet agents might rarely use it precisely because they can&apos;t complete it. &lt;strong&gt;Low agent usage can be evidence of a barrier rather than of low demand.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;So don&apos;t rely on usage statistics alone. Talk to developers and test representative scenarios yourself, looking for workflows that people want agents to perform but still complete by hand. Your long-term ambition should be to make your technology broadly usable by agents. Start with the most important workflows, and let both observed usage and unmet user needs decide which ones those are.&lt;/p&gt;
&lt;h2&gt;Make workflow friction part of your feedback loop&lt;/h2&gt;
&lt;p&gt;You don&apos;t evaluate Agent Experience once and declare it finished. Your product keeps evolving. &lt;a href=&quot;https://developer.microsoft.com/blog/not-all-model-upgrades-are-upgrades/&quot;&gt;Models change&lt;/a&gt;, and &lt;a href=&quot;https://developer.microsoft.com/blog/the-hidden-variables-in-your-agent-eval/&quot;&gt;agent harnesses introduce new capabilities and behaviors&lt;/a&gt;. A workflow that works well today can expose new bottlenecks tomorrow. So make representative agent workflows &lt;a href=&quot;/your-coding-agent-extension-needs-continuous-evaluation/&quot;&gt;part of your ongoing product development&lt;/a&gt;. Watch how agents behave, and let the failures and inefficiencies you find guide your improvements.&lt;/p&gt;
&lt;p&gt;Not every finding requires immediate action. Sometimes the right decision is to accept a limitation, because addressing it would cost more than the expected benefit. That&apos;s a legitimate product tradeoff, as long as you make it deliberately. The fix might also belong to a different team than the one that found the problem. Improving AX means looking beyond the boundaries of individual tools and product components.&lt;/p&gt;
&lt;p&gt;Whatever you decide, treat the friction as feedback rather than something to work around and forget. As agents take on more development tasks, their ability to run your workflows on their own becomes part of how your product works. &lt;a href=&quot;/your-product-didnt-get-worse/&quot;&gt;Exposing APIs and tools is a start&lt;/a&gt;. The larger opportunity lies in making those workflows discoverable and reliable for an agent, without wasting its time or your users&apos; tokens.&lt;/p&gt;
&lt;p&gt;The next time you struggle to automate a workflow, whether for an eval or anything else, don&apos;t reach for a more sophisticated harness right away. You might have found exactly where your technology needs to improve. &lt;strong&gt;Pick a common task. Let an agent attempt it and watch where it struggles.&lt;/strong&gt; Then ask yourself whether the problem lies with the agent or with the workflow you&apos;ve asked it to navigate.&lt;/p&gt;
</description><pubDate>Sun, 18 Oct 2026 10:47:39 GMT</pubDate></item><item><title>Be honest about what your evals prove</title><link>https://blog.mastykarz.nl/honest-evals-prove/</link><guid isPermaLink="true">https://blog.mastykarz.nl/honest-evals-prove/</guid><description>&lt;p&gt;&lt;img src=&quot;https://blog.mastykarz.nl/assets/images/2026/10/key-lock.png&quot; alt=&quot;Be honest about what your evals prove&quot; class=&quot;webfeedsFeaturedVisual&quot; /&gt;&lt;/p&gt;&lt;p&gt;Your coding agent just scored 100% on an eval, and every criterion passed. There&apos;s only one problem: the code it generated doesn&apos;t build. How is that possible? The eval checked 20 aspects of the implementation. The agent used the right APIs and followed the expected patterns. It created the required files and included the necessary configuration. Every one of those checks passed, but nobody tried building the application.&lt;/p&gt;
&lt;p&gt;The eval did exactly what it was designed to do. It verified the criteria it was given, and the agent met all of them. The problem starts with what we infer from that result. &lt;strong&gt;A 100% eval score means that 100% of the evaluated criteria passed. It doesn&apos;t tell you whether the agent completed the user&apos;s task.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;The temptation of proxies&lt;/h2&gt;
&lt;p&gt;Ideally, an eval verifies whether the agent achieved the user&apos;s goal. If the user asks for a working application, you verify that the application works. In practice, that&apos;s easier said than done. Consider evaluating an agent that builds and deploys a cloud application. To verify that it succeeded, you&apos;d need to build the generated code and provision the infrastructure. Then you&apos;d deploy the application and exercise its functionality before cleaning everything up. Along the way, you&apos;d have to handle failures and unpredictable outputs, sometimes for applications whose implementation you can&apos;t anticipate. A harness like that can take considerable time and money to build.&lt;/p&gt;
&lt;p&gt;So we compromise. Instead of verifying that the application works, we check whether the generated code looks plausible. We inspect the files and configuration that the agent produced and compare its API usage against the patterns we expect. These checks become &lt;em&gt;proxies&lt;/em&gt; for functional success, and there&apos;s nothing inherently wrong with that. Engineering is full of tradeoffs, and evaluating agents is no exception. Sometimes direct verification is impractical, and a proxy is the best evidence you can reasonably get. &lt;strong&gt;The trap is forgetting that we&apos;re measuring a proxy and communicating the result as proof of success.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;Validation isn&apos;t the same as success&lt;/h2&gt;
&lt;p&gt;Agent skills show the same pattern. You can automatically verify that a skill&apos;s frontmatter is valid and that its structure follows the specification. You can even check whether the agent invokes the skill or whether its output contains certain strings. These checks are useful because they catch structural problems and regressions, much like linting or static analysis does in traditional software development. But none of them prove that the skill helps the agent complete the user&apos;s task.&lt;/p&gt;
&lt;p&gt;Nobody claims that an application works because it passes linting. We treat static analysis and builds as different evidence from functional tests, and we validate performance and deployments separately again, because each of them tells us something different about the software. &lt;a href=&quot;https://developer.microsoft.com/blog/building-ax-evals-that-actually-work/&quot;&gt;Agent evaluations deserve the same discipline&lt;/a&gt;. A skill that passes structural validation meets certain technical requirements. An agent invoking the skill is &lt;a href=&quot;/eval-user-success-product-behavior/&quot;&gt;evidence that the skill was invoked&lt;/a&gt;. That&apos;s it. Neither, on its own, proves that the user got what they asked for, and even a comprehensive collection of proxy checks might miss the one thing that matters most.&lt;/p&gt;
&lt;h2&gt;What does your eval actually prove?&lt;/h2&gt;
&lt;p&gt;Before you publish an eval result, &lt;a href=&quot;/eval-lying/&quot;&gt;complete this sentence&lt;/a&gt;, and be precise about it:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;When this eval passes, we know that…&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If your eval checks implementation patterns without building the code, an honest answer sounds like this:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;When this eval passes, we know that the agent generated code that satisfies our implementation criteria. We haven&apos;t verified that it builds or runs.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;That&apos;s a defensible claim. What you shouldn&apos;t say is that the agent built a working application, because your eval never checked that. The same goes for the cloud application from earlier. An agent can generate infrastructure definitions and deployment scripts that look entirely correct, but until you deploy and validate the application, you don&apos;t know whether it works in the target environment. If a working deployment was what the user asked for, that&apos;s a significant gap in your evidence. An eval doesn&apos;t have to verify everything. You might deliberately accept that gap because direct verification costs too much, and that&apos;s your tradeoff to make. But &lt;strong&gt;the confidence you communicate should never exceed the evidence you&apos;ve collected.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;Don&apos;t let the nuance disappear&lt;/h2&gt;
&lt;p&gt;Imagine a team that reports consistently high eval scores. The results look excellent. Management sees progress that justifies the investment, and everyone believes that the &lt;a href=&quot;https://developer.microsoft.com/blog/what-is-agent-experience-ax/&quot;&gt;agent experience&lt;/a&gt; is improving. Meanwhile, users complain that the generated applications don&apos;t work. How can both be true? Perhaps the eval scenarios don&apos;t represent what users actually encounter, or the criteria verify implementation details while missing functional failures. Perhaps both. Either way, the team has been optimizing against its eval results while gradually losing touch with what its users experience.&lt;/p&gt;
&lt;p&gt;That&apos;s why a misleading eval can be worse than no eval at all. Without evidence, you know that you&apos;re uncertain. With a reassuring score that nobody fully understands, you might stop asking whether things actually work. So when users report failures despite high eval scores, treat that as a reason to revisit both your scenarios and your criteria. Your eval might cover different situations from the ones your users face, or measure outcomes other than the ones they care about.&lt;/p&gt;
&lt;p&gt;Preventing this is primarily the job of the people who design the evals. They know what they measured and which compromises they made, so they also know what remains unverified. You can&apos;t expect everyone who reads the results to inspect the eval harness and reconstruct those limitations themselves. You can report them in a matrix of separate scores or in a short explanation. Either works, as long as &lt;strong&gt;the scope and limitations of the evidence travel with the results.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;Be deliberate about what you measure&lt;/h2&gt;
&lt;p&gt;Proxies are often a practical response to how complex it is to evaluate real-world agent behavior. They&apos;re still compromises, though, and you should make them deliberately. Whenever possible, evaluate whether the user actually succeeded. When that&apos;s impractical, use the best evidence you can get and be clear about its limitations. Don&apos;t confuse validation checks with outcome evaluations, and don&apos;t let a perfect score imply more than you&apos;ve verified. Before you celebrate your next 100% eval score, ask yourself: &lt;strong&gt;when this eval passes, what do we actually know?&lt;/strong&gt; Then make sure that&apos;s also what everyone reading the results understands.&lt;/p&gt;
</description><pubDate>Sat, 17 Oct 2026 16:40:09 GMT</pubDate></item><item><title>Your eval judge doesn&apos;t know what you mean</title><link>https://blog.mastykarz.nl/eval-judge-know-mean/</link><guid isPermaLink="true">https://blog.mastykarz.nl/eval-judge-know-mean/</guid><description>&lt;p&gt;&lt;img src=&quot;https://blog.mastykarz.nl/assets/images/2026/10/rustic-chair.png&quot; alt=&quot;Your eval judge doesn&apos;t know what you mean&quot; class=&quot;webfeedsFeaturedVisual&quot; /&gt;&lt;/p&gt;&lt;p&gt;&amp;quot;Does the solution follow best practices?&amp;quot; It&apos;s a simple yes-or-no question, and it sounds like a reasonable evaluation criterion, especially when you&apos;re using a capable LLM as a judge. After all, modern models know a great deal about software development. Surely they can recognize good code when they see it?&lt;/p&gt;
&lt;p&gt;But with that one question, you&apos;ve delegated several decisions to the judge. Which best practices? Which of them are relevant to this solution? How strictly should the solution follow them, and do some matter more than others? What counts as sufficient evidence? The judge will happily fill in the blanks, and it might even give you a convincing explanation for its verdict. Yet nothing guarantees that it will &lt;a href=&quot;/i-was-wrong-there-are-bad-prompts/&quot;&gt;make the same assumptions next time&lt;/a&gt;, or that another model will reach the same conclusion.&lt;/p&gt;
&lt;p&gt;Missing knowledge is the more familiar version of this problem. If the judge &lt;a href=&quot;https://developer.microsoft.com/blog/building-ax-evals-that-actually-work/&quot;&gt;lacks domain knowledge about your technology&lt;/a&gt;, a vague criterion lets it score incorrect code as correct, so your criteria need to spell out what correct usage looks like. But even a judge with perfect domain knowledge can&apos;t tell which of several reasonable interpretations you had in mind, because you never wrote that choice down. Knowing more only gives the judge more plausible ways to fill in the blanks. &lt;strong&gt;A binary question isn&apos;t necessarily an objective question&lt;/strong&gt;, and no matter how capable the judge is, it can&apos;t stand in for a well-defined rubric.&lt;/p&gt;
&lt;h2&gt;Beware of hidden assumptions&lt;/h2&gt;
&lt;p&gt;Consider another seemingly reasonable criterion:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Does the solution handle user input?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Take a red pen and underline two parts: &lt;strong&gt;handle&lt;/strong&gt; and &lt;strong&gt;user input&lt;/strong&gt;. What does &lt;em&gt;handle&lt;/em&gt; mean? &lt;em&gt;Accept the input? Validate it? Sanitize it? Store it? Show an error when something goes wrong?&lt;/em&gt; And which &lt;em&gt;user input&lt;/em&gt; are we talking about: a customer email address, a search query, an uploaded file? Every unanswered question is an assumption we&apos;re asking the judge to make, and the more of them we leave open, the more room there is for its verdict to vary.&lt;/p&gt;
&lt;p&gt;So we improve the criterion:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Does the solution validate customer email addresses?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Better. We&apos;ve narrowed the scope and clarified what we expect the solution to do, but we&apos;re not finished. What makes an email address valid? Is checking for an &lt;code&gt;@&lt;/code&gt; symbol sufficient? What should happen when validation fails, and does the solution need to keep invalid data from being persisted? We&apos;ve removed some ambiguity, but the judge still has to decide what successful validation looks like.&lt;/p&gt;
&lt;h2&gt;Describe success without prescribing the implementation&lt;/h2&gt;
&lt;p&gt;Let&apos;s refine the criterion further:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The solution must reject customer email addresses that are empty, lack an &lt;code&gt;@&lt;/code&gt; symbol, or have no domain after the &lt;code&gt;@&lt;/code&gt; symbol. Invalid addresses must not be persisted, and the user must receive an indication that the input was rejected.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This isn&apos;t a comprehensive email-validation specification, and it isn&apos;t meant to be. It shows how we can replace an ambiguous requirement with explicit, observable expectations. We can make the judgment even clearer by specifying what counts as sufficient evidence. For example, the judge should identify the relevant validation logic and establish that invalid input can&apos;t reach the persistence operation. If the evidence is insufficient, the criterion doesn&apos;t pass.&lt;/p&gt;
&lt;p&gt;We might also provide examples of valid and invalid input to clarify the rules. But &lt;strong&gt;examples should support the requirement, not replace it&lt;/strong&gt;. Given only a handful of examples and no rule to anchor them, the judge might treat those examples as an exhaustive definition of correctness.&lt;/p&gt;
&lt;p&gt;Notice, that we haven&apos;t prescribed how the solution must implement validation. It might use a validation library or a regular expression, and it might validate input in a controller or a service. As long as it satisfies the stated requirements, &lt;a href=&quot;/eval-user-success-product-behavior/&quot;&gt;those implementation details shouldn&apos;t matter&lt;/a&gt;. It&apos;s the same principle we apply when writing maintainable tests: test behavior rather than implementation details. A refactoring shouldn&apos;t fail an evaluation merely because someone renamed a method or reorganized the code. &lt;strong&gt;Be precise about what success means, without unnecessarily prescribing how to achieve it.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;Deterministic doesn&apos;t mean accurate&lt;/h2&gt;
&lt;p&gt;If interpretation is the problem, why not eliminate it altogether? You could replace semantic judgments with deterministic checks. If a solution must use Contoso, check whether the generated code contains the string &lt;code&gt;Contoso&lt;/code&gt;. Every run produces the same answer for the same input, so the check is completely deterministic. It&apos;s also a &lt;a href=&quot;/eval-lying/&quot;&gt;terrible criterion&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The code might contain a comment saying &lt;code&gt;Decided not to use Contoso&lt;/code&gt;, and the check would happily report success. Conversely, the solution might correctly use Contoso through an abstraction without ever mentioning that exact string in the inspected file. We&apos;ve eliminated variability in the check without improving its ability to establish success. And the check quietly prescribes an implementation detail, the presence of one specific string, which is exactly what we decided to leave open.&lt;/p&gt;
&lt;p&gt;Deterministic checks are excellent when the requirement itself is deterministic. Checking whether code compiles or tests pass doesn&apos;t require an LLM. But when correctness depends on meaning, LLM judges offer something valuable: they can recognize semantically equivalent solutions despite differences in naming and structure. So the trick is to &lt;strong&gt;minimize interpretation of the requirements without eliminating the reasoning needed to evaluate the solution&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;Challenge your rubric before trusting it&lt;/h2&gt;
&lt;p&gt;Writing an explicit criterion is a good start, but how do you know you&apos;ve eliminated enough ambiguity? Start by reviewing the rubric critically. You can even ask an LLM to point out undefined terms and implicit assumptions, or places where a criterion supports more than one interpretation. A particularly useful question to ask yourself is: &lt;strong&gt;what do I assume the judge knows?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Then &lt;a href=&quot;https://developer.microsoft.com/blog/building-ax-evals-that-actually-work/&quot;&gt;run the evaluation against a few representative solutions&lt;/a&gt; and have the judge provide evidence alongside each score. A pass or fail tells you what the judge concluded, while the supporting evidence helps you understand why. Without it, you&apos;re left reconstructing the judgment yourself and possibly making incorrect assumptions about what happened.&lt;/p&gt;
&lt;p&gt;With the evidence in hand, inspect the verdicts. Look for cases where the judge reaches an unexpected conclusion or relies on irrelevant evidence, and for requirements it interprets differently from what you intended. Refine the rubric where it allowed those readings, then run it again.&lt;/p&gt;
&lt;p&gt;Also try running the rubric with a smaller, less capable model. A powerful model can sometimes compensate for missing instructions using its domain knowledge, which makes an ambiguous rubric appear reliable. A smaller model may expose those gaps sooner. Of course, not every failure indicates ambiguity. If you&apos;ve made the requirements as explicit as reasonably possible and the smaller model still struggles, it may simply lack the capabilities the judgment requires. So rather than forcing every evaluation onto the smallest model, use it to learn &lt;a href=&quot;/whats-your-minimal-viable-model/&quot;&gt;how much model your rubric actually needs&lt;/a&gt;. That way, you don&apos;t pay for a more capable judge merely to compensate for instructions you could have written more clearly.&lt;/p&gt;
&lt;h2&gt;Ambiguity has a maintenance cost&lt;/h2&gt;
&lt;p&gt;You might wonder whether all this effort is worth it. Why turn a short question into several detailed criteria when a capable LLM could probably figure out what you mean? Because that convenience comes with a hidden maintenance cost. If your rubric relies on the judge&apos;s implicit domain knowledge, you need to establish that its judgments are reliable. And when you change the judge model, you need to verify that the new model makes sufficiently similar decisions.&lt;/p&gt;
&lt;p&gt;Eventually, you&apos;ll have to &lt;a href=&quot;https://developer.microsoft.com/blog/not-all-model-upgrades-are-upgrades/&quot;&gt;change models&lt;/a&gt;, because providers update and retire them. A rubric that works only because a particular model happens to interpret its vague instructions the way you intended is a fragile investment. Explicit rubrics aren&apos;t immune to model changes, and they still need validation. But the less they depend on implicit knowledge, the easier they are to test, and the better your chances of running them on cheaper models.&lt;/p&gt;
&lt;p&gt;Yes, a precise rubric might require fifteen criteria where you previously had one. And that&apos;s okay. Once you&apos;ve established that your rubric works, you can reuse it across many evaluation runs, and the upfront effort pays back through more reliable results and less time spent investigating questionable verdicts. You&apos;re unlikely to eliminate every assumption, but you should make a deliberate effort to remove as many as you reasonably can.&lt;/p&gt;
&lt;p&gt;The next time you write an evaluation criterion, don&apos;t stop at asking whether the question has a yes-or-no answer. Ask what the judge needs to know to answer it and where that knowledge comes from. Then ask whether two reasonable judges could reach different conclusions. &lt;strong&gt;Your judge doesn&apos;t know what you mean. It knows what you wrote. Make the difference as small as possible.&lt;/strong&gt;&lt;/p&gt;
</description><pubDate>Sat, 17 Oct 2026 16:05:39 GMT</pubDate></item><item><title>As models get better, your agent tools should get smaller</title><link>https://blog.mastykarz.nl/models-better-agent-tools-smaller/</link><guid isPermaLink="true">https://blog.mastykarz.nl/models-better-agent-tools-smaller/</guid><description>&lt;p&gt;&lt;img src=&quot;https://blog.mastykarz.nl/assets/images/2026/10/pianist-hands.png&quot; alt=&quot;As models get better, your agent tools should get smaller&quot; class=&quot;webfeedsFeaturedVisual&quot; /&gt;&lt;/p&gt;&lt;p&gt;As models get better, your agent tools should get smaller. That sounds backwards, because for years we&apos;ve built developer tools by adding capabilities. We started with a specific problem, built a tool to solve it, and gradually expanded it to support more scenarios. The more problems a tool could solve, the more valuable it became. With AI coding agents, that logic doesn&apos;t necessarily hold anymore.&lt;/p&gt;
&lt;p&gt;Agent tools, such as skills and MCP servers, often exist to compensate for gaps in what an agent can do on its own. They supply knowledge and instructions the model lacks, or capabilities it couldn&apos;t otherwise access. But unlike traditional developer tools, they&apos;re built on a foundation that keeps evolving, and as that foundation improves, some of the gaps our tools were built to fill disappear. &lt;strong&gt;What made your agent tool valuable yesterday might make it a liability tomorrow.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;The foundation is moving&lt;/h2&gt;
&lt;p&gt;Imagine you&apos;ve built a skill that teaches an AI coding agent how to work with your technology. It explains the architecture and recommends patterns, and it walks the agent through common workflows with examples. When you built it, you &lt;a href=&quot;https://developer.microsoft.com/blog/is-your-agent-extension-actually-working/&quot;&gt;evaluated the agent without the skill&lt;/a&gt;, identified where it struggled, and added instructions to address those gaps. Your evaluations showed that the skill helped the agent complete tasks. Great! You shipped it.&lt;/p&gt;
&lt;p&gt;Six months later, the models have changed. They&apos;re better at understanding unfamiliar APIs and reasoning through complex workflows. Some of the instructions that were essential when you built the skill might be unnecessary now if the agent already knows how to complete the task without them. Worse, they might steer it toward an approach that&apos;s no longer the best one.&lt;/p&gt;
&lt;p&gt;Yet your skill still loads into the agent&apos;s context and influences its decisions. A traditional tool generally stays useful until the problem or its requirements change. An agent skill, however, can lose value simply because the model using it became more capable. And if you&apos;re not measuring that value, you might never notice.&lt;/p&gt;
&lt;h2&gt;More isn&apos;t always better&lt;/h2&gt;
&lt;p&gt;It&apos;s tempting to think that additional instructions can only help. After all, if the agent already knows something, what&apos;s the harm in telling it again? Unfortunately, LLMs don&apos;t work that way. Every instruction you add &lt;a href=&quot;/inference-efficiency-protecting-attention/&quot;&gt;competes for the agent&apos;s attention&lt;/a&gt;. It consumes context and can influence which approach the agent chooses. Instructions can &lt;a href=&quot;https://developer.microsoft.com/blog/when-your-agent-extensions-fight-each-other/&quot;&gt;overlap or conflict with each other&lt;/a&gt;, and they can constrain an agent that could have found a better solution on its own.&lt;/p&gt;
&lt;p&gt;The consequences show up in quality and cost. Your skill might make the agent process more tokens or lead it through unnecessary tool calls and reasoning steps. Even when the final result is correct, &lt;a href=&quot;/eval-score-half-result/&quot;&gt;you pay more to get it&lt;/a&gt;. More concerningly, the skill might make the outcome worse. An agent following outdated or overly prescriptive instructions can produce an inferior solution to the one it would have found without them.&lt;/p&gt;
&lt;p&gt;This doesn&apos;t mean that fewer instructions are always better. Specialized knowledge and organization-specific conventions can remain essential, and so can access to external systems. The question is whether the information you&apos;re adding gives the agent something it actually needs. &lt;strong&gt;Add only what&apos;s necessary to help the agent succeed, whatever size that makes your skill.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;Start with the agent, not the skill&lt;/h2&gt;
&lt;p&gt;There&apos;s a common trap when building agent extensions: assuming from the start that an extension is needed. You know your technology and the mistakes developers commonly make with it. You can imagine dozens of instructions and examples that might help an AI coding agent use it correctly, so you package that knowledge into a skill. But how do you know the agent needs it?&lt;/p&gt;
&lt;p&gt;You don&apos;t, until you&apos;ve &lt;a href=&quot;https://developer.microsoft.com/blog/stop-overloading-your-skills/&quot;&gt;seen what the agent can accomplish on its own&lt;/a&gt;. So before building anything, give the agent representative tasks, measure the quality of its outcomes and the cost of completing them, and &lt;a href=&quot;/agent-eval-more-than-result/&quot;&gt;inspect its trajectory&lt;/a&gt; to understand where it struggles. Only then decide whether an intervention is necessary.&lt;/p&gt;
&lt;p&gt;Perhaps the agent lacks specific knowledge about your API. Perhaps it struggles to discover the right CLI command, or it knows what to do but keeps choosing an inefficient approach. These are different problems that might require different solutions. A skill might help, but so might &lt;a href=&quot;https://developer.microsoft.com/blog/how-to-test-agent-experience-changes-without-shipping-them/&quot;&gt;clearer documentation and tool descriptions, or a change to the underlying API&lt;/a&gt;. If you start by asking how to improve your skill, you&apos;ve already assumed the answer. &lt;strong&gt;Don&apos;t become so invested in your solution that you forget the problem you&apos;re trying to solve.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;Make pruning part of development&lt;/h2&gt;
&lt;p&gt;Building a useful skill isn&apos;t a one-time exercise, and neither is &lt;a href=&quot;/your-coding-agent-extension-needs-continuous-evaluation/&quot;&gt;proving that it works&lt;/a&gt;. The baseline you measured before building the skill describes the agent as it was then, and each model release can change it. So as models improve, revisit the assumptions that justified your skill in the first place. A &lt;a href=&quot;https://developer.microsoft.com/blog/not-all-model-upgrades-are-upgrades/&quot;&gt;new model release&lt;/a&gt; is a natural moment to reevaluate. &lt;a href=&quot;https://developer.microsoft.com/blog/the-hidden-variables-in-your-agent-eval/&quot;&gt;Agent harnesses evolve too&lt;/a&gt;, sometimes daily, so evaluating on a practical, periodic cadence works better than reacting to every small change. The process itself is straightforward:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Reestablish the baseline.&lt;/strong&gt; Evaluate what the agent can accomplish without your skill using representative tasks and agent profiles.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Identify the remaining gaps.&lt;/strong&gt; Examine outcomes, task costs, and trajectories to understand where the agent still struggles.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Compare those gaps with your skill.&lt;/strong&gt; Determine which instructions and capabilities address problems that still exist.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prune what&apos;s no longer needed.&lt;/strong&gt; Remove redundant instructions, simplify workflows, or retire the entire skill if it no longer contributes meaningful value.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Verify the result.&lt;/strong&gt; Evaluate the changes to ensure that removing functionality hasn&apos;t introduced regressions.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Keep in mind that evaluation results are contextual. A skill that improves outcomes with one model and harness might provide no benefit with another. If you&apos;re building for a broad audience, evaluate across the &lt;a href=&quot;https://developer.microsoft.com/blog/what-is-agent-experience-ax/&quot;&gt;agent profiles&lt;/a&gt; your audience actually uses, meaning the combinations of harness, model, and other extensions they work with. There&apos;s no universal verdict on whether a skill is useful.&lt;/p&gt;
&lt;p&gt;Similarly, the absence of a measurable improvement doesn&apos;t automatically prove that an instruction is unnecessary. Perhaps your evaluations don&apos;t cover the scenario it was designed to address, and that&apos;s worth investigating before you remove it. Everything in your skill should serve a purpose, and if you can&apos;t demonstrate that something helps, you should at least question why it&apos;s there.&lt;/p&gt;
&lt;h2&gt;Learn to let go&lt;/h2&gt;
&lt;p&gt;For developers used to building tools, pruning can feel counterintuitive. We spend time understanding problems and designing solutions, and we take pride in what we&apos;ve built. Removing functionality can feel like throwing away that investment, particularly if the feature was genuinely useful when we created it.&lt;/p&gt;
&lt;p&gt;But agent tools operate in a different environment. The models beneath them keep getting more capable, independently of our work. We don&apos;t control that progress, and we shouldn&apos;t pretend it isn&apos;t happening. Holding on to instructions simply because we spent time writing them risks making the experience worse for the very people we&apos;re trying to help.&lt;/p&gt;
&lt;p&gt;Measure your skill&apos;s success by whether agents can use your technology to achieve high-quality outcomes at an acceptable cost. How many capabilities the skill contains or &lt;a href=&quot;/eval-user-success-product-behavior/&quot;&gt;how often agents invoke it&lt;/a&gt; says nothing about that, and neither does the work you&apos;ve put into it. Sometimes improving that experience means adding something, and sometimes it means changing something. Increasingly, it might mean removing something.&lt;/p&gt;
&lt;p&gt;That requires a different mindset from the one we&apos;ve traditionally applied to developer tools. Instead of assuming that every iteration should make our tools more capable, we need to keep asking whether those capabilities are still necessary. &lt;strong&gt;Your agent tools should get smaller as models get better&lt;/strong&gt;, because each new model can close some of the gaps they were built to fill. Build what agents need. Measure whether it helps. And be willing to remove it once they no longer need it.&lt;/p&gt;
</description><pubDate>Sat, 17 Oct 2026 15:39:45 GMT</pubDate></item><item><title>Your eval should describe the user&apos;s success, not your product&apos;s behavior</title><link>https://blog.mastykarz.nl/eval-user-success-product-behavior/</link><guid isPermaLink="true">https://blog.mastykarz.nl/eval-user-success-product-behavior/</guid><description>&lt;p&gt;&lt;img src=&quot;https://blog.mastykarz.nl/assets/images/2026/10/high-striker.png&quot; alt=&quot;Your eval should describe the user&apos;s success, not your product&apos;s behavior&quot; class=&quot;webfeedsFeaturedVisual&quot; /&gt;&lt;/p&gt;&lt;p&gt;When you build an extension for an AI coding agent, it&apos;s tempting to include its invocation in your evaluation criteria. You built a tool to help the agent. Surely, if the agent uses it, that&apos;s a good thing? Not necessarily. Your eval should describe the user&apos;s success, not your product&apos;s behavior.&lt;/p&gt;
&lt;p&gt;Say you&apos;re evaluating a scenario where a developer asks an agent for architectural guidance. You provide a documentation search tool that you believe will help, so one of your evaluation criteria could be:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The agent uses the documentation search tool.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;But does the developer actually care? Probably not. They care whether the architectural guidance is correct and complete for their situation, and perhaps whether getting there was reasonably cheap. If the agent can provide perfect guidance from what it already knows, calling your tool makes the experience worse, because it &lt;a href=&quot;https://developer.microsoft.com/blog/stop-overloading-your-skills/&quot;&gt;consumes additional tokens without improving the result&lt;/a&gt;. By scoring the invocation, you&apos;ve made your eval prefer your product even when the user doesn&apos;t.&lt;/p&gt;
&lt;h2&gt;Invocation isn&apos;t success&lt;/h2&gt;
&lt;p&gt;Suppose the agent calls your tool. Great. What happened next? Did it use the result? Did the result change its answer, and did the answer become better? Was the tool even necessary? Invocation alone answers none of these questions.&lt;/p&gt;
&lt;p&gt;Worse, treating invocation as success can hide exactly the information your eval is supposed to uncover. Imagine the agent needs current information to complete a task. If your criterion says:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The agent calls our tool for current information.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;a failure &lt;a href=&quot;/eval-lying/&quot;&gt;tells you only&lt;/a&gt; that your tool wasn&apos;t called. A criterion such as:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The answer uses the current version of the API.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;tells you whether the agent has the capability the user needs.&lt;/p&gt;
&lt;p&gt;Perhaps the agent &lt;a href=&quot;https://developer.microsoft.com/blog/knowledge-cutoff-is-a-poor-proxy-for-model-capability/&quot;&gt;already knows the answer&lt;/a&gt;, or it finds the information another way. &lt;a href=&quot;https://developer.microsoft.com/blog/your-ai-coding-agent-evaluation-is-only-as-good-as-its-sandbox/&quot;&gt;Agents can be surprisingly resourceful.&lt;/a&gt; If either path produces the right result, the user got what they needed and your extension wasn&apos;t necessary for that run. An invocation criterion would report that run as a failure, even though it just showed you a part of the task where your extension adds nothing.&lt;/p&gt;
&lt;h2&gt;Start with the job, not the tool&lt;/h2&gt;
&lt;p&gt;When defining an eval, start with the user&apos;s need. What job are they trying to do, and how would &lt;strong&gt;they&lt;/strong&gt; determine whether they succeeded? Those answers should become your evaluation criteria. Notice, that none of them mention your extension.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.microsoft.com/blog/is-your-agent-extension-actually-working/&quot;&gt;Run that eval against the agent without your extension first&lt;/a&gt;. You might discover that the agent already handles parts of the scenario perfectly well. That tells you where an extension isn&apos;t needed and lets you focus on the gaps where it can actually improve the experience.&lt;/p&gt;
&lt;p&gt;Only then introduce your extension and run the same eval again. For every scenario, look at two dimensions: &lt;a href=&quot;/eval-score-half-result/&quot;&gt;&lt;strong&gt;quality and cost&lt;/strong&gt;&lt;/a&gt;. Your extension might improve quality, reduce task cost, or both. It can also make either one worse. Without the baseline, you don&apos;t know whether your extension solved a problem, moved it around, or introduced one.&lt;/p&gt;
&lt;h2&gt;Put invocation where it belongs&lt;/h2&gt;
&lt;p&gt;None of this means you shouldn&apos;t measure invocation. You absolutely should. If you&apos;ve established that your extension improves the outcome at an acceptable cost, you want the agent to use it. After all, the user went through the trouble of discovering and acquiring your extension, and an extension that &lt;a href=&quot;https://developer.microsoft.com/blog/stop-skillmaxxing-save-your-tokens/&quot;&gt;consumes context but rarely gets invoked&lt;/a&gt; isn&apos;t particularly useful.&lt;/p&gt;
&lt;p&gt;But treat invocation as a &lt;strong&gt;diagnostic&lt;/strong&gt; that explains the score rather than a part of it. Capture it in the &lt;a href=&quot;/agent-eval-more-than-result/&quot;&gt;trajectory&lt;/a&gt;. If your evaluation system supports unscored checks, surface invocation there so you don&apos;t have to dig through every trajectory manually. Then you can separate two very different questions: &lt;em&gt;did the user get a better result?&lt;/em&gt; and &lt;em&gt;did the agent use the thing we built to help it get there?&lt;/em&gt; The first belongs in your score. The second helps you explain and improve it.&lt;/p&gt;
&lt;p&gt;If your extension creates measurable lift when invoked but isn&apos;t invoked reliably, you have a discovery or invocation problem, and that&apos;s worth improving. If it&apos;s invoked reliably but improves neither quality nor cost, you have a much more fundamental problem. Don&apos;t let a high invocation rate disguise it.&lt;/p&gt;
&lt;h2&gt;Beware the metric you want to grow&lt;/h2&gt;
&lt;p&gt;Tool owners have skin in the game. Once an extension exists, it&apos;s easy for its discovery and invocation to become product metrics. More installations and more invocations look like growth, and growth demonstrates that the product is valuable and justifies further investment.&lt;/p&gt;
&lt;p&gt;Then that thinking creeps into the eval. Invocation becomes an evaluation criterion, so higher invocation produces a higher score, and the higher score becomes evidence that the extension works. You&apos;ve built a measurement system that validates the assumption it was supposed to test.&lt;/p&gt;
&lt;p&gt;So make the extension &lt;a href=&quot;/does-every-agent-skill-need-eval/&quot;&gt;earn its place&lt;/a&gt;. Does it improve Agent Experience for the scenario? In other words, can the agent produce a better result, or the same result for less money? Those are tangible improvements. And ultimately, everyone understands dollars.&lt;/p&gt;
&lt;p&gt;Measure invocation to understand &lt;strong&gt;how&lt;/strong&gt; your extension contributes to those improvements. Optimize invocation once you&apos;ve demonstrated that using the extension actually helps. But don&apos;t confuse your product being used with the user&apos;s problem being solved. &lt;strong&gt;Your eval should describe the user&apos;s success, not your product&apos;s behavior.&lt;/strong&gt;&lt;/p&gt;
</description><pubDate>Sun, 04 Oct 2026 14:54:12 GMT</pubDate></item><item><title>Stop sensationalizing</title><link>https://blog.mastykarz.nl/stop-sensationalizing/</link><guid isPermaLink="true">https://blog.mastykarz.nl/stop-sensationalizing/</guid><description>&lt;p&gt;&lt;img src=&quot;https://blog.mastykarz.nl/assets/images/2026/09/chef.png&quot; alt=&quot;Stop sensationalizing&quot; class=&quot;webfeedsFeaturedVisual&quot; /&gt;&lt;/p&gt;&lt;p&gt;Using an app isn&apos;t an &lt;em&gt;experience&lt;/em&gt;. Forgetting something doesn&apos;t mean there&apos;s a &lt;em&gt;gap&lt;/em&gt;. The essence isn&apos;t a &lt;em&gt;spine&lt;/em&gt;. Trying a few things and keeping what works doesn&apos;t need to be &lt;em&gt;hill climbing&lt;/em&gt;. Not every abstraction is a &lt;em&gt;primitive&lt;/em&gt;, every improvement an &lt;em&gt;unlock&lt;/em&gt;, every feedback loop a &lt;em&gt;flywheel&lt;/em&gt;, every advantage a &lt;em&gt;moat&lt;/em&gt;, or every change a &lt;em&gt;paradigm shift&lt;/em&gt;. Not everything is &lt;em&gt;10x&lt;/em&gt;, &lt;em&gt;AI-native&lt;/em&gt;, &lt;em&gt;agentic&lt;/em&gt;, the &lt;em&gt;missing layer&lt;/em&gt;, or the &lt;em&gt;operating system&lt;/em&gt; for X. And we&apos;re hardly ever &lt;em&gt;cooked&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Let apps be apps, features be features, improvements be improvements, and problems be problems. Talk like the real person you are, and save the big words for the rare occasions when you actually need them.&lt;/p&gt;
</description><pubDate>Sat, 26 Sep 2026 12:12:02 GMT</pubDate></item><item><title>Why pay an agent to run a command you already know?</title><link>https://blog.mastykarz.nl/pay-agent-run-command-already-know/</link><guid isPermaLink="true">https://blog.mastykarz.nl/pay-agent-run-command-already-know/</guid><description>&lt;p&gt;&lt;img src=&quot;https://blog.mastykarz.nl/assets/images/2026/09/climber.png&quot; alt=&quot;Why pay an agent to run a command you already know?&quot; class=&quot;webfeedsFeaturedVisual&quot; /&gt;&lt;/p&gt;&lt;p&gt;Using an AI agent to run a command can seem ridiculous. If I want to list the files in the current directory, I can type:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;ls
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Or I can tell an agent:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;List the files in this directory.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The second option takes longer to type and spends LLM tokens, and the agent will probably end up running &lt;code&gt;ls&lt;/code&gt; anyway. So what exactly did I gain? That was my knee-jerk reaction to using agents for simple command-line tasks.&lt;/p&gt;
&lt;p&gt;Sure, agents save me from memorizing obscure commands and arguments. I can talk to my computer in plain English instead of remembering whether a particular option is &lt;code&gt;--resource-group&lt;/code&gt;, &lt;code&gt;--resourceGroup&lt;/code&gt;, &lt;code&gt;-g&lt;/code&gt;, or something else entirely. Convenient? Absolutely. Worth putting an LLM between me and every command I run? I&apos;m less sure. But that comparison assumes that everything goes right, and that&apos;s where it falls apart.&lt;/p&gt;
&lt;h2&gt;A command is a step&lt;/h2&gt;
&lt;p&gt;Imagine that I want to accomplish something using a CLI. I figure out the command, type it, press Enter, and it works. Great. Had I asked an agent to do the same thing, it might have translated my request into exactly the same command. I&apos;d have saved myself some recall, but probably not much time. Depending on the task, writing the prompt might even have taken longer than typing the command.&lt;/p&gt;
&lt;p&gt;Now imagine that the command fails. Suddenly, I have work to do. I need to read the error and understand what it means. I need to figure out whether the problem is the command, my configuration, authentication, permissions, a missing dependency, an incompatible version, or something else entirely. I might need to search the web or the documentation, or run another command to inspect the current state. Then I change something, try again, hit another error and investigate that one. Eventually, hopefully, I get back to what I originally wanted to accomplish.&lt;/p&gt;
&lt;p&gt;The command itself took a second, but recovering from its failure might take twenty minutes. That&apos;s because when I execute a command, I&apos;m asking the computer to perform a &lt;strong&gt;step&lt;/strong&gt;. If that step fails, the computer has done its job: it tried to execute my instruction and reported what happened. The problem is mine again.&lt;/p&gt;
&lt;h2&gt;An agent can own the outcome&lt;/h2&gt;
&lt;p&gt;Now consider the same task delegated to an agent. I don&apos;t need to tell it which command to execute. I can tell it what I want to achieve, and that&apos;s usually closer to what I actually care about anyway. I care that the application is deployed and that the project builds. I care that the dependency is updated, the development environment works or the resource is configured correctly. The commands are merely means to those ends.&lt;/p&gt;
&lt;p&gt;The agent figures out the steps. Maybe its first command works. Maybe it doesn&apos;t, and even then the task hasn&apos;t failed. For the agent, the error is just another piece of information. It can inspect the error, investigate the environment and consult the documentation. Then it changes its approach, runs another command, verifies the result and continues. What would have interrupted my work becomes part of its trajectory.&lt;/p&gt;
&lt;p&gt;That&apos;s a fundamentally different contract. When I run a command, everything that happens after I press Enter is up to me. When I delegate an outcome, the agent takes on the work of getting from its first attempt to the result I asked for. &lt;strong&gt;Commands execute instructions. Agents pursue outcomes.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;A good contractor owns the problem&lt;/h2&gt;
&lt;p&gt;Suppose something in your house needs fixing. You could hire a contractor and give them a precise sequence of instructions: remove this screw, take off this panel, replace this part, put the panel back, tighten the screw. But that&apos;s probably not why you&apos;re hiring an expert. You tell them what&apos;s wrong and what you want instead, and they figure it out.&lt;/p&gt;
&lt;p&gt;Perhaps they remove the panel and discover that the problem isn&apos;t what either of you expected. They inspect it and adjust their approach. They replace a different component, test it, discover another issue and fix that too, until they give you what you asked for. You hired them to own the problem, including the parts neither of you could see before the panel came off. Of course, that doesn&apos;t mean they should disappear into your house, make arbitrary changes and eventually announce:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Done.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A good contractor communicates. If they discover something consequential, they tell you. If there are several reasonable approaches with meaningful tradeoffs, they explain them and ask you to decide. They use their expertise to determine what they can handle themselves and what requires your involvement. Agents should work the same way. When you delegate an outcome, the agent absorbs the mechanical work and still involves you when your judgment matters. And if there are decisions you always want to make yourself, you can say so upfront.&lt;/p&gt;
&lt;h2&gt;Failure changes the economics&lt;/h2&gt;
&lt;p&gt;It&apos;s tempting to evaluate agents by comparing them with the individual actions they replace. Why ask an LLM to run &lt;code&gt;ls&lt;/code&gt; when you can just type &lt;code&gt;ls&lt;/code&gt;? On the happy path, that&apos;s a perfectly reasonable question. There, the agent is a slightly more convenient but significantly more expensive interface to the exact same operation, and sometimes it&apos;s &lt;a href=&quot;/what-is-task-worth-ai-agents/&quot;&gt;outright wasteful&lt;/a&gt;. But that comparison puts an action next to an outcome.&lt;/p&gt;
&lt;p&gt;When something goes wrong, the difference between doing the work yourself and delegating it becomes enormous. A command that succeeds immediately might save me ten seconds if delegated. A command that fails might send me into twenty minutes of reading error messages, inspecting state and checking documentation, trying fixes and undoing them, and then figuring out how to resume the original task. An agent can absorb most of that. And crucially, I don&apos;t need to predict beforehand whether the command will fail. I&apos;m delegating the uncertainty along with the work.&lt;/p&gt;
&lt;p&gt;So the more uncertain the path is, the more interesting delegation becomes. If I know exactly what needs to happen, know the command will work and can type it faster than I can explain it, I&apos;ll just run it. Sometimes &lt;code&gt;ls&lt;/code&gt; really is faster than asking an agent what&apos;s in a directory. That&apos;s also why happy-path demos and individual command executions make agents so hard to judge. They show an agent performing a known action, while its value appears when the known action turns out not to be enough and the agent keeps going.&lt;/p&gt;
&lt;h2&gt;The command was never the job&lt;/h2&gt;
&lt;p&gt;For decades, we&apos;ve expressed our intentions to computers as increasingly sophisticated sequences of operations. We learned commands and APIs, configuration formats and tool-specific syntax. Agents introduce another interface, where you describe the state you want to reach and let the system figure out how to get there.&lt;/p&gt;
&lt;p&gt;A command says &lt;strong&gt;do this&lt;/strong&gt;. An agent can be told &lt;strong&gt;make this true&lt;/strong&gt;. The first delegates an action. The second delegates responsibility for navigating the path between where you are and where you want to be, including every failure along the way.&lt;/p&gt;
&lt;p&gt;Maybe we&apos;ve been looking at the extra tokens the wrong way. When an agent runs a command you could have typed yourself, you pay for more than the command. You pay for an agent that deals with whatever happens next.&lt;/p&gt;
</description><pubDate>Sat, 26 Sep 2026 11:12:02 GMT</pubDate></item><item><title>An eval score is only half the result</title><link>https://blog.mastykarz.nl/eval-score-half-result/</link><guid isPermaLink="true">https://blog.mastykarz.nl/eval-score-half-result/</guid><description>&lt;p&gt;&lt;img src=&quot;https://blog.mastykarz.nl/assets/images/2026/09/parcel-bill.png&quot; alt=&quot;An eval score is only half the result&quot; class=&quot;webfeedsFeaturedVisual&quot; /&gt;&lt;/p&gt;&lt;p&gt;When you evaluate an AI coding agent, it&apos;s tempting to focus on one number: the score. Say you&apos;re evaluating the base behavior of an agent and it passes 80% of your criteria. You add a skill, run the eval again, and now it passes 95%. Success. Except the first run cost $0.34 and the second cost $5.26. You improved the score by 15 percentage points and increased the inference cost more than 15 times. Is that still a success?&lt;/p&gt;
&lt;h2&gt;Quality is only one dimension&lt;/h2&gt;
&lt;p&gt;An eval score tells you how well the agent performed against the criteria you&apos;ve defined. But whether the result was worth getting depends on what it cost. When you&apos;re evaluating a change to an agent, such as &lt;a href=&quot;https://developer.microsoft.com/blog/is-your-agent-extension-actually-working/&quot;&gt;adding a skill&lt;/a&gt;, changing instructions, &lt;a href=&quot;https://developer.microsoft.com/blog/your-work-might-not-need-the-smartest-model/&quot;&gt;switching models&lt;/a&gt;, or exposing a new tool, look at two dimensions: &lt;strong&gt;quality and inference cost&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Think of them as two axes. High quality at low cost is the obvious sweet spot. Low quality at high cost is something you want to avoid. The other two combinations are where the decision becomes interesting.&lt;/p&gt;
&lt;p&gt;High quality at high cost might be exactly what you need for one task and completely unreasonable for another. Lower quality at dramatically lower cost might be an attractive tradeoff, provided you understand what&apos;s missing and can live with it. Your eval provides the evidence, but you still need an opinion to make the decision.&lt;/p&gt;
&lt;p&gt;There is no universally acceptable cost for an agent task because &lt;a href=&quot;/what-is-task-worth-ai-agents/&quot;&gt;what makes sense depends on what the task is worth&lt;/a&gt;. A price of $5.26 can be reasonable while $0.34 can still be wasteful. You need to know what you&apos;re buying for that money.&lt;/p&gt;
&lt;p&gt;The same applies to quality. Suppose your agent scores 87%. Is that good? You can&apos;t tell from the number. If the agent solves the hardest parts of the task and leaves a few trivial things unfinished, 87% might be incredibly useful. If it handles all the easy work but consistently fails the one difficult requirement that made you reach for an agent in the first place, 87% might be useless.&lt;/p&gt;
&lt;p&gt;If your eval is based on meaningful criteria, use the aggregate score to compare configurations, then inspect which criteria passed and which didn&apos;t. It&apos;ll help you understand if the agent handles what you care about. A useful decision combines that knowledge with what you&apos;re willing to pay for it.&lt;/p&gt;
&lt;h2&gt;Don&apos;t measure one run&lt;/h2&gt;
&lt;p&gt;Agent behavior is nondeterministic. &lt;a href=&quot;/does-every-agent-skill-need-eval/&quot;&gt;Run the same task several times&lt;/a&gt; and you might get different results and very different costs. Even consistent scores can hide an unpredictable bill. Imagine five runs all scoring around 95%, with these inference costs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$0.52&lt;/li&gt;
&lt;li&gt;$0.61&lt;/li&gt;
&lt;li&gt;$0.73&lt;/li&gt;
&lt;li&gt;$1.84&lt;/li&gt;
&lt;li&gt;$5.12&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Reporting the average hides how widely those costs spread. Your quality might be predictable while your cost varies by almost ten times. Someone eventually has to pick up the bill, and businesses don&apos;t have unlimited budgets.&lt;/p&gt;
&lt;p&gt;The reverse is equally concerning. Stable cost with wildly varying quality leaves you unsure what that money will buy. Ideally, repeated runs cluster in the part of the quality-cost space that&apos;s acceptable for your task. When they don&apos;t, the spread itself is a finding.&lt;/p&gt;
&lt;p&gt;When you see unexpected variance in quality, cost, or both, &lt;a href=&quot;/agent-eval-more-than-result/&quot;&gt;look at the trajectories&lt;/a&gt;. They can reveal whether an expensive run explored several approaches, read far more context, repeatedly called a tool, or missed the right path at first. That gives you a cause to investigate even when the final result hides it.&lt;/p&gt;
&lt;h2&gt;Cost compounds&lt;/h2&gt;
&lt;p&gt;During development, inference costs can feel insignificant. What&apos;s another few dollars? But you&apos;re evaluating something that might eventually perform the task repeatedly. Going from $0.34 to $5.26 means spending an extra $4.92 &lt;strong&gt;every time the task runs&lt;/strong&gt;. At 100 runs, that&apos;s $492. At 10,000 runs, that&apos;s $49,200. Let that sink in.&lt;/p&gt;
&lt;p&gt;How much that matters depends, again, on the task. Something that runs twice a year has very different economics from something that runs thousands of times every day. Expected volume is part of deciding what you&apos;re willing to pay.&lt;/p&gt;
&lt;h2&gt;Set your boundaries&lt;/h2&gt;
&lt;p&gt;Ideally, before running your evals, you have some idea of your acceptable quality and cost. You don&apos;t need to get it exactly right. Start with an opinion. Perhaps $100 for scaffolding a project is obviously too much. Perhaps getting below 90% quality makes the result create more work than it saves. Those boundaries can become more precise as you collect data and learn what the agent can actually do.&lt;/p&gt;
&lt;p&gt;What&apos;s dangerous is having no boundaries at all. When someone else is picking up the inference bill, it&apos;s easy to behave as if the budget is unlimited. Then every quality improvement looks attractive regardless of what it costs.&lt;/p&gt;
&lt;p&gt;Eventually, someone will look at the bill. So record the quality and inference cost of every run. Run the eval enough times to see their variance. Look at which criteria are responsible for quality gaps, then inspect trajectories when either quality or cost behaves unexpectedly.&lt;/p&gt;
&lt;p&gt;Finally, consider how often the task will run and develop an opinion about what you&apos;re willing to pay for the quality you&apos;re getting. Optimizing for either the highest score or the lowest cost ignores half of that decision. You&apos;re looking for a quality-cost tradeoff that makes sense for your task, with enough consistency that you can rely on it.&lt;/p&gt;
&lt;p&gt;A useful eval records the whole tradeoff. The score is only half the result.&lt;/p&gt;
</description><pubDate>Sun, 20 Sep 2026 14:48:07 GMT</pubDate></item><item><title>Your agent eval is more than its result</title><link>https://blog.mastykarz.nl/agent-eval-more-than-result/</link><guid isPermaLink="true">https://blog.mastykarz.nl/agent-eval-more-than-result/</guid><description>&lt;p&gt;&lt;img src=&quot;https://blog.mastykarz.nl/assets/images/2026/09/mouse-maze.png&quot; alt=&quot;Your agent eval is more than its result&quot; class=&quot;webfeedsFeaturedVisual&quot; /&gt;&lt;/p&gt;&lt;p&gt;You run an eval. The agent completes the task, and the grader gives it 100%. Great. Now look at the trajectory.&lt;/p&gt;
&lt;p&gt;When evaluating agents, it&apos;s tempting to focus on results. Did the agent complete the task and satisfy the criteria? How much did the task cost? These measurements are important, but they don&apos;t tell you what happened.&lt;/p&gt;
&lt;p&gt;An agent can arrive at the right result after taking unnecessary detours. It can search for information it already has or read irrelevant files. It can overlook a tool designed specifically for the task and reproduce its functionality manually. Then it burns tokens recovering from decisions that didn&apos;t need to be made in the first place.&lt;/p&gt;
&lt;p&gt;The result tells you where the agent ended up. The trajectory tells you how it got there. And if you&apos;re trying to understand &lt;a href=&quot;https://developer.microsoft.com/blog/how-ai-coding-agents-actually-use-your-technology/&quot;&gt;how agents experience your product&lt;/a&gt;, you need both.&lt;/p&gt;
&lt;h2&gt;A perfect score can hide waste&lt;/h2&gt;
&lt;p&gt;There are two sides to an agent completing a task: the quality of the result and &lt;a href=&quot;/does-every-agent-skill-need-eval/&quot;&gt;the cost of producing it&lt;/a&gt;. Imagine an agent scores 100% on every criterion in your eval. If you only look at the score, there&apos;s nothing left to improve. But perhaps the agent read ten files when it needed two. Perhaps it performed three searches before finding the obvious source. It might have called the same tool several times with slightly different arguments or spent thousands of tokens figuring out something you could have made obvious. Its answer is still correct, but the user still paid for all those wasted tokens.&lt;/p&gt;
&lt;p&gt;Looking at the trajectory lets you spot these inefficiencies. You can see which tools the agent chose and which arguments it passed. You can see which sources it read, whether it searched the web or navigated directly to a known source. You can also see how much information it needed before deciding what to do next. Every step is an opportunity to learn something.&lt;/p&gt;
&lt;p&gt;Trajectories also show you where not to intervene. For example, while &lt;a href=&quot;https://devblogs.microsoft.com/microsoft365dev/behind-spfx-dev-skills-testing-what-agents-know-and-fixing-what-they-miss/&quot;&gt;evaluating agents working with SharePoint Framework (SPFx) projects&lt;/a&gt;, we saw agents go directly to the SPFx release notes when they needed to understand changes between versions. They also recognized an SPFx project simply from the shape of the workspace! Without the trajectories, we might have assumed that we needed to explain what SPFx is, how its projects are structured, or how they are built and tested. We could have packaged that information into documentation or skills and injected it into the agent&apos;s context. It would have looked helpful, but it would also have been largely redundant.&lt;/p&gt;
&lt;p&gt;Every piece of &lt;a href=&quot;https://developer.microsoft.com/blog/stop-overloading-your-skills/&quot;&gt;unnecessary information consumes context&lt;/a&gt; and ultimately costs the user money. Seeing what the agent already knows helps you resist the temptation to explain everything. Sometimes the best improvement is information you decide not to add.&lt;/p&gt;
&lt;h2&gt;Use failures to form hypotheses&lt;/h2&gt;
&lt;p&gt;Trajectories become even more useful when an eval fails. A failed result tells you that something went wrong, but it doesn&apos;t necessarily tell you why. In the same SPFx evaluations, we noticed that agents upgrading projects weren&apos;t using &lt;a href=&quot;https://aka.ms/cli-m365&quot;&gt;CLI for Microsoft 365&lt;/a&gt;. The CLI already has a &lt;a href=&quot;https://pnp.github.io/cli-microsoft365/cmd/spfx/project/project-upgrade/&quot;&gt;deterministic command that analyzes an SPFx project across versions and produces a ready-to-use upgrade script&lt;/a&gt;. Instead, agents were attempting the upgrade manually.&lt;/p&gt;
&lt;p&gt;Knowing that the result was incomplete wasn&apos;t enough to tell us what to improve. And that&apos;s exactly where the trajectory gave us a clue. We &lt;a href=&quot;https://developer.microsoft.com/blog/how-to-test-agent-experience-changes-without-shipping-them/&quot;&gt;experimented with different approaches&lt;/a&gt; and eventually added a warning to our documentation explaining that manual upgrades are likely to be incomplete and that agents should use the CLI instead.&lt;/p&gt;
&lt;p&gt;Then we ran the eval again and looked at the trajectory again. A better score alone wouldn&apos;t verify that our intervention changed the behavior we intended to change. The loop is:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;
  &lt;source srcset=&quot;https://blog.mastykarz.nl/assets/images/2026/09/evaluation-workflow.avif&quot; type=&quot;image/avif&quot;&gt;
  &lt;img src=&quot;https://blog.mastykarz.nl/assets/images/2026/09/evaluation-workflow.png&quot; alt=&quot;Evaluation workflow: run the eval, inspect its trajectory, form a hypothesis, and make a focused change&quot;&gt;
&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Before shipping an Agent Experience improvement, treat it as a hypothesis. The result tells you whether performance changed. The trajectory helps you understand whether it changed for the reason you expected. That&apos;s the evidence you need before turning an experiment into guidance for your users.&lt;/p&gt;
&lt;h2&gt;Improve the natural path&lt;/h2&gt;
&lt;p&gt;Once you start examining trajectories, you&apos;ll see plenty of opportunities to make them shorter. You could write a special instruction for one task or create a skill for another. But beware of chasing perfection!&lt;/p&gt;
&lt;p&gt;Ideally, an agent should complete a task with as few unnecessary steps and tokens as possible, but the optimization has to remain practical. If every task requires a bespoke skill, your eval results might look fantastic while the experience bears little resemblance to what users encounter in practice. You optimized the test case instead of improving the product.&lt;/p&gt;
&lt;p&gt;The goal is to improve the natural path agents take when working with your product. Deciding where that boundary lies requires taste, skepticism, empathy, and knowledge of your audience. Trajectory data can show you what happened, but it can&apos;t make every product decision for you.&lt;/p&gt;
&lt;h2&gt;Compare runs without ignoring anomalies&lt;/h2&gt;
&lt;p&gt;Agents are nondeterministic. Every token in their context can potentially alter what they do next, which is another reason not to treat a single trajectory as truth. &lt;a href=&quot;/your-coding-agent-extension-needs-continuous-evaluation/&quot;&gt;You must compare trajectories across runs&lt;/a&gt;. A behavior that appears repeatedly is different from a one-off detour. By comparing runs you can distinguish patterns from anomalies and see how behavior changes when you modify documentation, a skill, an MCP server, the model, or another part of the environment.&lt;/p&gt;
&lt;p&gt;But don&apos;t dismiss anomalies simply because they happened once. An unexpected tool call, source, or reasoning path is a lead. It might be irrelevant, or it might expose behavior you didn&apos;t know existed and give you something worth investigating across additional runs.&lt;/p&gt;
&lt;p&gt;Automated checks can eventually help you catch behaviors you already know about. But they won&apos;t reliably show you behaviors you haven&apos;t thought to check for. That&apos;s exactly why inspecting trajectories remains valuable.&lt;/p&gt;
&lt;h2&gt;Make trajectories first-class eval artifacts&lt;/h2&gt;
&lt;p&gt;If you&apos;re building agent evals, store enough information to reconstruct what happened. Ideally, that includes the user&apos;s prompt and the agent&apos;s reasoning when available. Keep every tool call with its arguments and the responses returned by those tools. When possible, &lt;a href=&quot;https://developer.microsoft.com/blog/the-hidden-variables-in-your-agent-eval/&quot;&gt;keep the agent&apos;s system prompt&lt;/a&gt; too. It can reveal environmental influences you might otherwise attribute to the model or your product: which tools were available, what workspace information was provided, OS-specific instructions, full paths included in context, or other biases introduced by the agent harness.&lt;/p&gt;
&lt;p&gt;A trajectory isn&apos;t merely a debugging log. It&apos;s part of the evidence produced by your eval. Store it alongside the result and task cost. Something you didn&apos;t think was important at the time might later become exactly what you need to understand a behavior.&lt;/p&gt;
&lt;p&gt;I prefer to store trajectories in &lt;a href=&quot;https://github.com/harbor-framework/harbor/blob/main/rfcs/0001-trajectory-format.md&quot;&gt;Agent Trajectory Interchange Format (ATIF)&lt;/a&gt; and explore them using the &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=waldek.atif-visualizer&quot;&gt;ATIF Preview extension for VS Code&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/assets/images/2026/09/atif-preview.png&quot;&gt;&lt;picture&gt;
  &lt;source srcset=&quot;https://blog.mastykarz.nl/assets/images/2026/09/atif-preview.avif&quot; type=&quot;image/avif&quot;&gt;
  &lt;img src=&quot;https://blog.mastykarz.nl/assets/images/2026/09/atif-preview.png&quot; alt=&quot;ATIF Preview in VS Code showing trajectory metadata, tool filters, and an expanded agent step beside the source JSON&quot;&gt;
&lt;/picture&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ATIF gives different agents a common format, so I can compare their trajectories without first translating each agent&apos;s raw logs or events. It also makes trajectories easier to read. ATIF can link a parent trajectory to its subagent trajectories and distinguish utility calls, such as progress messages or generated session titles, from the work itself.&lt;/p&gt;
&lt;p&gt;You don&apos;t necessarily need to inspect every trajectory forever. When you&apos;re running mature incremental evals and results continue to follow established patterns, there might be little reason to pore over every run. But when you&apos;re starting an evaluation, investigating a failure, changing your Agent Experience, or looking for ways to improve it, replay the run step by step.&lt;/p&gt;
&lt;p&gt;Why did the agent choose this tool, and were the arguments sensible? Did it need that file or search? Could it have reached the same result with less information and fewer tokens? Answering those questions reveals both waste and missed opportunities. And don&apos;t look only for mistakes. Surprisingly good decisions show where the model already has enough knowledge and where adding more guidance might make the experience worse. A score compresses an entire run into a number. That&apos;s useful, but if you&apos;re trying to understand how agents experience your product, don&apos;t throw away everything that happened before that number. &lt;strong&gt;Look at the trajectory.&lt;/strong&gt;&lt;/p&gt;
</description><pubDate>Sun, 20 Sep 2026 09:30:34 GMT</pubDate></item><item><title>Is your eval lying to you?</title><link>https://blog.mastykarz.nl/eval-lying/</link><guid isPermaLink="true">https://blog.mastykarz.nl/eval-lying/</guid><description>&lt;p&gt;&lt;img src=&quot;https://blog.mastykarz.nl/assets/images/2026/09/hiker-red-flag.png&quot; alt=&quot;Is your eval lying to you?&quot; class=&quot;webfeedsFeaturedVisual&quot; /&gt;&lt;/p&gt;&lt;p&gt;When building evals for AI coding agents, &lt;code&gt;string contains&lt;/code&gt; is incredibly tempting. It&apos;s fast and deterministic. And it costs practically nothing, so you can &lt;a href=&quot;/your-coding-agent-extension-needs-continuous-evaluation/&quot;&gt;run it on every change in CI&lt;/a&gt; without worrying about inference cost or latency. But is using it making your eval lie to you?&lt;/p&gt;
&lt;p&gt;Want to know whether the agent used Azure? Look for &lt;code&gt;Azure&lt;/code&gt;, right? Want to know whether it used a particular API? Look for the API name. Want to know whether it created the right configuration? Check whether the expected string is in the file. Pass. Ship it. But you haven&apos;t established any of those things.&lt;/p&gt;
&lt;h2&gt;What did your grader prove?&lt;/h2&gt;
&lt;p&gt;Suppose your eval says that the generated solution must use Azure, and your grader checks whether the generated files contain the string &lt;code&gt;Azure&lt;/code&gt;. The grader passes. What do you now know? Only that the string &lt;code&gt;Azure&lt;/code&gt; appears somewhere in the generated files. That&apos;s it.&lt;/p&gt;
&lt;p&gt;The string could appear in code that uses Azure, but it could also appear in a comment. After all, a single line is enough to satisfy your grader. Here is all it needs to see:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;// Don&apos;t use Azure here.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That comment passes the check. So would dead code, an unused dependency, documentation, or a test fixture. A configuration file could contain the string even though the application never loads that file. Your grader finds what it&apos;s looking for, but the behavior you care about is still absent.&lt;/p&gt;
&lt;p&gt;The same problem works in reverse. If the string isn&apos;t present, can you conclude that the solution doesn&apos;t use Azure? No. The agent could use an SDK without mentioning Azure explicitly, refer only to a package or class name, or express the same intent using words you didn&apos;t anticipate. Natural language makes this worse because the difference between &lt;em&gt;did&lt;/em&gt; and &lt;em&gt;didn&apos;t&lt;/em&gt; can be one word while the keyword remains exactly the same. A deterministic grader gives you a deterministic answer, but that answer only means what the check establishes.&lt;/p&gt;
&lt;h2&gt;Finish the sentence&lt;/h2&gt;
&lt;p&gt;There&apos;s a simple test I like for eval criteria. Complete one sentence for a passing result, then another for a failure. Be literal:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;If this grader passes, I now know that ______.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;If this grader fails, I now know that ______.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;For a &lt;code&gt;string contains &amp;quot;Azure&amp;quot;&lt;/code&gt; grader, the answers are narrow. They describe only what the grader observed. Anything more is an inference:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If this grader passes, I know the string &lt;code&gt;Azure&lt;/code&gt; occurs in the inspected content.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;If this grader fails, I know the string &lt;code&gt;Azure&lt;/code&gt; doesn&apos;t occur in the inspected content.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If that&apos;s what you wanted to measure, great. But when you complete the first sentence with &lt;em&gt;the agent correctly used Azure&lt;/em&gt;, you&apos;ve made a leap your evidence doesn&apos;t support. The grader isn&apos;t necessarily inaccurate. It might be perfectly accurate at what it does, while we ask it to prove something it can&apos;t.&lt;/p&gt;
&lt;h2&gt;Easy evidence can give you false assurance&lt;/h2&gt;
&lt;p&gt;It&apos;s easy to see why people use simple deterministic graders. Agentic evals cost money and can take a long time to run. LLM judges add inference cost and latency. Building, running, or deploying generated applications adds infrastructure and complexity. In comparison, &lt;code&gt;string contains&lt;/code&gt; takes milliseconds, which makes it ideal for CI... and potentially terrible evidence.&lt;/p&gt;
&lt;p&gt;So you start optimizing an eval around what&apos;s convenient to measure instead of what you need to know. The result can be a fast, repeatable evaluation pipeline that gives you false assurance on every run. I&apos;d rather run fewer evals that produce meaningful evidence than continuously run evals that confidently tell me very little.&lt;/p&gt;
&lt;h2&gt;Ask the system that can answer the question&lt;/h2&gt;
&lt;p&gt;If you want to know whether generated code builds, build it. We&apos;ve seen solutions receive perfect scores from an LLM judge only to fail compilation. The judge could assess whether the implementation looked correct, but only the compiler could verify it.&lt;/p&gt;
&lt;p&gt;If you want to establish whether dependencies can be restored, restore them. If you want to know whether a JSON file follows a schema, validate it. If you want to establish whether tests pass, run them. And where reasonably possible, if you want to establish whether the application works, run it.&lt;/p&gt;
&lt;p&gt;This is where deterministic graders work well because the check directly establishes the property you care about. Using an LLM to predict whether a project will compile makes little sense when the compiler can answer authoritatively. You&apos;d be asking an LLM to approximate an answer that an existing tool can give you.&lt;/p&gt;
&lt;p&gt;But running generated applications is harder than building them. Real applications need credentials and configuration. They also need data, infrastructure, and access to external services. Deploying them adds another layer of complexity. Unfortunately, coding agents often struggle at those boundaries, which makes it tempting to verify something easier instead.&lt;/p&gt;
&lt;p&gt;So instead, you check for the expected artifacts or words in the output. An LLM judge says the implementation looks plausible. Then you treat those observations as evidence that the integration works, even though none of them exercised it. Sometimes running the complete solution genuinely isn&apos;t practical, and that&apos;s okay. An eval doesn&apos;t need to prove everything, but its report should make clear &lt;a href=&quot;/does-every-agent-skill-need-eval/&quot;&gt;what it did and didn&apos;t establish&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;LLM judges answer different questions&lt;/h2&gt;
&lt;p&gt;Semantic criteria are different. An LLM judge can distinguish &lt;em&gt;use Azure for storing the data&lt;/em&gt; from &lt;em&gt;do not use Azure for storing the data&lt;/em&gt;. It can inspect surrounding code, reason about how components relate, and recognize implementations that don&apos;t contain the vocabulary you anticipated when writing the eval.&lt;/p&gt;
&lt;p&gt;But an LLM judge doesn&apos;t eliminate the evidence problem. It can&apos;t reliably replace building and running the software. And even if it could reproduce every relevant compiler, package manager, test runner, or runtime check, why would you ask it to? We already have those tools. Use LLM judges for semantic questions and deterministic tools when they can answer a question directly.&lt;/p&gt;
&lt;h2&gt;Treat agentic evals like integration tests&lt;/h2&gt;
&lt;p&gt;When you evaluate an MCP server, skill, extension, or another capability for a coding agent, you care whether the agent can complete the task successfully. Finding a particular implementation detail in its output tells you far less. That&apos;s why I find it more useful to think about these evals as integration tests than unit tests.&lt;/p&gt;
&lt;p&gt;In our evals, building, testing, running, and deploying are separate gates. Alongside them, LLM judges evaluate the semantic properties relevant to each scenario. Keeping the checks separate shows you whether dependency restoration failed, compilation broke, or a buildable implementation missed an important requirement. One broad proxy shouldn&apos;t have to answer all of these questions.&lt;/p&gt;
&lt;p&gt;Still, deterministic graders are excellent when the property you&apos;re measuring is deterministic. The problem starts when you choose a convenient signal and quietly expand the claim you make from it. Before adding a grader to your next agentic eval, finish these two sentences:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;If this grader passes, I now know that ______.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;If this grader fails, I now know that ______.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Then compare those answers with what you intend to claim about your agent, skill, MCP server, or extension. If they don&apos;t match, find stronger evidence. Your eval doesn&apos;t become trustworthy because it runs on every commit. &lt;strong&gt;It becomes trustworthy when its evidence supports the claims you make from it.&lt;/strong&gt;&lt;/p&gt;
</description><pubDate>Sat, 19 Sep 2026 15:34:24 GMT</pubDate></item></channel></rss>