<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Stratos Louvaris</title>
    <description>The latest articles on DEV Community by Stratos Louvaris (@stratoslouvaris).</description>
    <link>https://dev.to/stratoslouvaris</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4093436%2Fce62382b-cbf9-439b-a105-36358c9f9f3b.png</url>
      <title>DEV Community: Stratos Louvaris</title>
      <link>https://dev.to/stratoslouvaris</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/stratoslouvaris"/>
    <language>en</language>
    <item>
      <title>Evaluating AI Agents: Why 95% Per-Step Accuracy Is a Failing Grade (Part 1 of 2)</title>
      <dc:creator>Stratos Louvaris</dc:creator>
      <pubDate>Sun, 30 Aug 2026 07:29:23 +0000</pubDate>
      <link>https://dev.to/stratoslouvaris/evaluating-ai-agents-why-95-per-step-accuracy-is-a-failing-grade-part-1-of-2-3o9g</link>
      <guid>https://dev.to/stratoslouvaris/evaluating-ai-agents-why-95-per-step-accuracy-is-a-failing-grade-part-1-of-2-3o9g</guid>
      <description>&lt;p&gt;Why agent evaluation breaks the tools built for prompts, and how to measure outcomes instead of vibes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Takeaways
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reliability compounds against you:&lt;/strong&gt; An agent that gets each step right 95% of the time completes a 20-step task 36% of the time. Per-step accuracy is not the number you ship on.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Grade the outcome, not the path:&lt;/strong&gt; Check the environment's end state, not the transcript. Agents find valid approaches you never anticipated, so asserting a fixed sequence of tool calls just makes tests brittle.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agents lie about finishing:&lt;/strong&gt; In a 2026 study, 45-48% of failures in single-control τ²-bench domains were cases where the agent declared success while the environment said otherwise.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;pass^k beats pass@k:&lt;/strong&gt; A 70% agent run three times succeeds &lt;em&gt;at least once&lt;/em&gt; 97% of the time, and &lt;em&gt;every time&lt;/em&gt; 34% of the time. Production doesn't get retries.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Start absurdly small:&lt;/strong&gt; 20 to 50 tasks drawn from real failures is a legitimate starting suite. Waiting for a thousand means shipping blind for a year.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your agent works. You've run it fifteen times, watched it pick the right tools, and it did the thing. So you ship it.&lt;/p&gt;

&lt;p&gt;Three weeks later it's quietly failing on a chunk of real requests, and nobody can tell you which change caused it - because nothing in your test suite was ever measuring the thing that broke.&lt;/p&gt;

&lt;p&gt;I've been on the wrong end of exactly this. I built a hybrid retrieval system once, keyword search fused with vector search, and I had tests. Green across the board. What those tests actually asserted was that a search &lt;em&gt;returned results&lt;/em&gt;. Not that the right result came back first. So when a scoring bug inverted the ranking and put the weaker match above the stronger one, every test stayed green. It shipped, and it sat in production for three weeks until I noticed by eye.&lt;/p&gt;

&lt;p&gt;That wasn't a testing failure. It was an &lt;em&gt;evaluation&lt;/em&gt; failure. My tests proved the code ran. Nothing proved the output was any good.&lt;/p&gt;

&lt;p&gt;Here's the thing: that gap gets dramatically worse when your system stops being one prompt and becomes an agent. A prompt eval scores one input against one output. An agent produces a &lt;em&gt;trajectory&lt;/em&gt; - model turns, tool calls, results, changes to the world - and ends in a modified environment rather than a string. Almost none of the intuitions you built on prompt evals survive that transition.&lt;/p&gt;

&lt;p&gt;Let's break down what changes, and what to measure instead.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Compounding Math: Why 95% Per Step Is a Failing Grade
&lt;/h2&gt;

&lt;p&gt;Start from first principles. If an agent's steps succeed independently with probability &lt;code&gt;p&lt;/code&gt;, then finishing an &lt;code&gt;N&lt;/code&gt;-step task means getting every step right: &lt;code&gt;p^N&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That exponent is unforgiving.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyogdkz5atlin00thqs1f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyogdkz5atlin00thqs1f.png" alt="Grid of end-to-end agent success rates by per-step reliability and number of steps" width="800" height="478"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Read the 95% row. Five steps and you're at 77%. Twenty steps, 36%. Fifty steps, 7.7%. A number that looks excellent on a prompt eval dashboard produces a system that fails two times in three.&lt;/p&gt;

&lt;p&gt;Now invert the question, because this is the version that changes how you build. To hit 90% end-to-end, what per-step reliability do you need? Over 10 steps, 98.95%. Over 100 steps, &lt;strong&gt;99.89%&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Is 100 steps realistic? &lt;a href="https://arxiv.org/abs/2606.29537" rel="noopener noreferrer"&gt;OSWorld 2.0&lt;/a&gt;, published June 2026, builds 108 long-horizon computer-use workflows with a median human completion time of about 1.6 hours. Its tasks average &lt;strong&gt;318 tool calls&lt;/strong&gt;. At a 500-step budget, the best system on the board completes &lt;strong&gt;20.6%&lt;/strong&gt; of tasks end to end, scoring 54.8% on partial credit.&lt;/p&gt;

&lt;p&gt;To be honest about the limits: this is an intuition pump, not a measurement. Real steps aren't independent. Failures correlate, since one bad plan dooms everything after it, and agents also retry and self-correct, which pushes real performance &lt;em&gt;above&lt;/em&gt; &lt;code&gt;p^N&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;But the direction is right, and the direction is what matters: &lt;strong&gt;long-horizon reliability cannot be extrapolated from single-step accuracy.&lt;/strong&gt; You have to measure it end to end.&lt;/p&gt;

&lt;h2&gt;
  
  
  Grade the Outcome, Not the Story
&lt;/h2&gt;

&lt;p&gt;So what do you assert against?&lt;/p&gt;

&lt;p&gt;The instinct most engineers have - and I had it too - is to check that the agent followed the right steps in the right order. Anthropic's engineering team pushes back on this directly in &lt;a href="https://www.anthropic.com/engineering/demystifying-evals-for-ai-agents" rel="noopener noreferrer"&gt;Demystifying evals for AI agents&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"We've found this approach too rigid and results in overly brittle tests, as agents regularly find valid approaches that eval designers didn't anticipate. So as not to unnecessarily punish creativity, it's often better to grade what the agent produced, not the path it took."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Their flight-booking example is the clearest statement of the principle I've seen: the agent might end its transcript with "Your flight has been booked," but the outcome is &lt;em&gt;whether a reservation exists in the environment's SQL database&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;This is not hypothetical. &lt;a href="https://arxiv.org/abs/2406.12045" rel="noopener noreferrer"&gt;τ-bench&lt;/a&gt; was built on exactly this idea - it "compares the database state at the end of a conversation with the annotated goal state." And a 2026 paper, &lt;a href="https://arxiv.org/abs/2606.09863" rel="noopener noreferrer"&gt;From Confident Closing to Silent Failure&lt;/a&gt;, put numbers on why transcripts can't be trusted: agents assert completion when the environment says otherwise in &lt;strong&gt;45-48%&lt;/strong&gt; of failures in single-control τ²-bench domains, and &lt;strong&gt;75.8%&lt;/strong&gt; of self-assessing coding-agent trajectories on AppWorld.&lt;/p&gt;

&lt;p&gt;Here's the part that should change your tooling choice. That same paper tested LLM judges at detecting these false successes. The judges never beat &lt;strong&gt;AUROC 0.65&lt;/strong&gt; on τ²-bench and managed only 0.54 on AppWorld. A plain TF-IDF detector hit &lt;strong&gt;0.83 and 0.95&lt;/strong&gt; respectively, at 3,300 times lower latency.&lt;/p&gt;

&lt;p&gt;On the specific question of "did the agent actually finish," a cheap deterministic detector beat the expensive language model badly. Reach for the state check first.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdpmhnlqjna4f51yncgpz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdpmhnlqjna4f51yncgpz.png" alt="What the transcript says versus what the environment says about the same agent run" width="800" height="439"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From a practical standpoint, a useful agent assertion has five layers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_refund_task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;instruction&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# 1. OUTCOME - the environment must match the annotated goal state
&lt;/span&gt;    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;db_hash&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gold_db_hash&lt;/span&gt;

    &lt;span class="c1"&gt;# 2. REQUIRED ACTIONS - the side effect must actually have happened
&lt;/span&gt;    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;called&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;issue_refund&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;order_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;W123&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;52.40&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# 3. COMMUNICATION - required information reached the user
&lt;/span&gt;    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;5 to 7 business days&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;final_message&lt;/span&gt;

    &lt;span class="c1"&gt;# 4. FORBIDDEN ACTIONS - the negative case matters just as much
&lt;/span&gt;    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;called&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cancel_order&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# 5. BUDGET - cost and latency are results, not footnotes
&lt;/span&gt;    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;n_turns&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cost_usd&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mf"&gt;0.35&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Assertion 4 is the one people skip, and the one I'd argue hardest for. Anthropic's guidance is blunt: test "both the cases where a behavior should occur and where it shouldn't," because "one-sided evals create one-sided optimization." An agent that never refuses anything will ace a suite made entirely of things it should do. That's not a capable agent. That's an unguarded one, and you built the suite that rewarded it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Reliability Metric Almost Nobody Reports
&lt;/h2&gt;

&lt;p&gt;Now the metric that changed how I think about shipping agents.&lt;/p&gt;

&lt;p&gt;Most people know &lt;strong&gt;pass@k&lt;/strong&gt; from code benchmarks: out of &lt;code&gt;k&lt;/code&gt; attempts, did &lt;em&gt;at least one&lt;/em&gt; succeed? It's the right metric when a human filters the output, like a coding assistant offering suggestions you review.&lt;/p&gt;

&lt;p&gt;It is exactly the wrong metric for an agent acting on its own.&lt;/p&gt;

&lt;p&gt;τ-bench introduced &lt;strong&gt;pass^k&lt;/strong&gt; for this: out of &lt;code&gt;k&lt;/code&gt; attempts, did &lt;em&gt;all of them&lt;/em&gt; succeed? That's the probability your agent handles the same task correctly every single time a customer asks.&lt;/p&gt;

&lt;p&gt;The gap is brutal. Take an agent that succeeds 70% of the time on a single attempt. Run it three times: pass@3 is about &lt;strong&gt;97%&lt;/strong&gt;. pass^3 is about &lt;strong&gt;34%&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkd1hpq4869tunmddqdhs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkd1hpq4869tunmddqdhs.png" alt="pass@k versus pass^k for a 70% agent across one to four attempts" width="799" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/sierra-research/tau-bench" rel="noopener noreferrer"&gt;published τ-bench numbers&lt;/a&gt; show the same shape on real systems. In the retail domain, claude-3-5-sonnet goes 0.692 at pass^1 down to &lt;strong&gt;0.462&lt;/strong&gt; at pass^4. In airline, gpt-4o falls from 0.420 to &lt;strong&gt;0.200&lt;/strong&gt;. The paper's own abstract puts it plainly: state-of-the-art function-calling agents "succeed on &amp;lt;50% of the tasks, and are quite inconsistent (pass^8 &amp;lt;25% in retail)."&lt;/p&gt;

&lt;p&gt;Here's where it gets interesting. Measured pass^k decays &lt;em&gt;slower&lt;/em&gt; than simply raising pass^1 to the power of k. For that retail row, &lt;code&gt;0.692^4&lt;/code&gt; would be 0.229, but the measured pass^4 is 0.462 - double. That gap means task difficulty is heterogeneous: some tasks the agent nails every time, others it never gets.&lt;/p&gt;

&lt;p&gt;Which gives you a free diagnostic. &lt;strong&gt;If your measured pass^k lands close to (pass^1)^k, your task suite is too uniform&lt;/strong&gt; and probably isn't stressing anything.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building Your First 20 Tasks
&lt;/h2&gt;

&lt;p&gt;Most teams have no agent evals because they picture a thousand hand-labelled cases and quietly decide to do it later. So let me kill that objection with the actual recommended number.&lt;/p&gt;

&lt;p&gt;Anthropic's guidance: &lt;strong&gt;"20-50 simple tasks drawn from real failures is a great start."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Four rules make those tasks worth having.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Two experts must agree.&lt;/strong&gt; A good task is one where two domain experts would independently reach the same pass/fail verdict. If you and a colleague can argue about whether a run passed, the task is underspecified and will produce noise forever.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Don't write the rubric first.&lt;/strong&gt; This is the counterintuitive one, and it comes from &lt;a href="https://arxiv.org/abs/2404.12272" rel="noopener noreferrer"&gt;Shankar et al.'s "Who Validates the Validators?"&lt;/a&gt;. They named a phenomenon called &lt;strong&gt;criteria drift&lt;/strong&gt;: "users need criteria to grade outputs, but grading outputs helps users define criteria." It's a genuine catch-22. Some criteria simply cannot be defined until you've looked at what your system actually produces. So look at real traces &lt;em&gt;first&lt;/em&gt;, then write the rubric the failures suggest.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Review enough traces to hit saturation.&lt;/strong&gt; Hamel Husain's &lt;a href="https://hamel.dev/blog/posts/evals-faq/" rel="noopener noreferrer"&gt;evals FAQ&lt;/a&gt; gives a clean heuristic: "you should aim to review at least 100 traces," and "if ~20 traces don't turn up a new category, you can stop." Group what you find into a handful of named failure modes, then count them. The counts tell you what to fix. The failure modes tell you what to measure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Make the verdict binary.&lt;/strong&gt; Not a 1-5 score. "Binary evaluations force clearer thinking and more consistent labeling." A 1-5 scale invites annotators to park everything on 3, and nobody can tell you what separates a 3 from a 4.&lt;/p&gt;

&lt;p&gt;One number for perspective on the investment: Husain reports spending &lt;strong&gt;60-80% of development time on error analysis and evaluation&lt;/strong&gt;. That sounds enormous until you remember that the alternative is what I did with that retrieval bug - shipping a silent regression and finding it by accident three weeks later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ask Yourself What You'd Bet On
&lt;/h2&gt;

&lt;p&gt;Every engineer building agents right now is making an implicit claim: that watching a system work a dozen times tells you how it behaves a thousand times. The compounding math says that claim is false, and says so quantitatively.&lt;/p&gt;

&lt;p&gt;What makes this worth the effort isn't the dashboard. Evaluation is the only thing that converts "I think it got better" into "it got better, and here's the number." Non-deterministic software doesn't give you that for free the way a compiler does. You build the instrument yourself.&lt;/p&gt;

&lt;p&gt;So start small, this week. Pull twenty real failures out of your logs. Write the outcome assertion for each - the end state, not the transcript. Run them three times and look at your pass^3, not your &lt;a href="mailto:pass@3"&gt;pass@3&lt;/a&gt;. That's a weekend of work, and it will tell you more than every demo you've run so far.&lt;/p&gt;

&lt;p&gt;Part 2 covers what code assertions can't reach: building an LLM judge that isn't fooling you, evaluating RAG without debugging blind, which frameworks are worth adopting in 2026, and wiring it all into a CI gate. Read it here: &lt;a href="https://blog.stratoslouvaris.gr/llm-judges-eval-frameworks-part-2/" rel="noopener noreferrer"&gt;Building an Eval Stack That Catches Regressions (Part 2 of 2)&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Measure the outcome, or you're just watching a demo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Do I need an evaluation framework to start?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No, and starting with one is often a mistake. Your first agent eval can be plain pytest with the five assertions above. Frameworks earn their place once you need dataset management, judge alignment, or a shared dashboard - Part 2 covers which ones are worth it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I just use a public benchmark like τ-bench or SWE-bench instead?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Use them to eliminate weak models, not to choose your system. Public benchmarks are contaminated and frequently buggy - a 2025 audit of ten major agent benchmarks (&lt;a href="https://arxiv.org/abs/2507.02825" rel="noopener noreferrer"&gt;the ABC checklist paper&lt;/a&gt;) found flaws that shift reported performance "by up to 100% in relative terms," including τ-bench counting empty responses as successes. Your own 20 tasks are worth more than any leaderboard.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is it safe to run agent evals against real systems?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Treat the eval environment as a place where a badly-behaved agent will do real damage, because that's exactly what you're testing for. Run against a sandboxed copy with seeded data, never live credentials or production databases. And include tasks where the correct outcome is that the agent &lt;em&gt;refuses&lt;/em&gt; and escalates - that's the negative case from assertion 4, and it catches an agent willing to issue a refund it shouldn't.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How often should I redo the error analysis?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Whenever something material changes: a model upgrade, a prompt rewrite, a new tool, an incident, or a spike in complaints. Between those, a weekly pass over 10-20 traces keeps you honest without eating the sprint.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My agent passes everything. Is that good?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It means your suite is too easy. A 100% pass rate carries no information about where the system is fragile. Go find twenty harder failures and add those.&lt;/p&gt;

&lt;p&gt;P.S. If you want the single best primary source on this, read Anthropic's &lt;a href="https://www.anthropic.com/engineering/demystifying-evals-for-ai-agents" rel="noopener noreferrer"&gt;Demystifying evals for AI agents&lt;/a&gt; - it's the densest practical guidance published on the topic.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://blog.stratoslouvaris.gr/evaluating-ai-agents-part-1/" rel="noopener noreferrer"&gt;blog.stratoslouvaris.gr&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I write about building AI agents that work in production, and what breaks along the way.&lt;br&gt;
&lt;a href="https://blog.stratoslouvaris.gr/#/portal/signup" rel="noopener noreferrer"&gt;Subscribe to the newsletter&lt;/a&gt; or find me on &lt;a href="https://www.linkedin.com/in/stratos-louvaris/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>testing</category>
      <category>llm</category>
    </item>
    <item>
      <title>Agent Skills Explained: What They Are, How to Use Them, and How They Differ From MCP</title>
      <dc:creator>Stratos Louvaris</dc:creator>
      <pubDate>Sun, 30 Aug 2026 07:29:02 +0000</pubDate>
      <link>https://dev.to/stratoslouvaris/agent-skills-explained-what-they-are-how-to-use-them-and-how-they-differ-from-mcp-a99</link>
      <guid>https://dev.to/stratoslouvaris/agent-skills-explained-what-they-are-how-to-use-them-and-how-they-differ-from-mcp-a99</guid>
      <description>&lt;p&gt;A first-principles guide to Claude's Agent Skills: how they work, how to build one with skill-creator, and how they differ from MCP servers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Takeaways
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A skill is a folder, not a feature:&lt;/strong&gt; An Agent Skill is a directory with a &lt;code&gt;SKILL.md&lt;/code&gt; file plus optional scripts and resources. It teaches Claude a procedure once, so you stop re-explaining it every conversation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Progressive disclosure keeps it cheap:&lt;/strong&gt; Claude loads only a skill's name and description at startup (~100 tokens each), reads the full instructions only when your request matches, and touches bundled files only if the task needs them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write once, run everywhere:&lt;/strong&gt; The same &lt;code&gt;SKILL.md&lt;/code&gt; format works across claude.ai, Claude Code, the Agent SDK, and the API. Because Anthropic published it as an open standard, tools like Codex, OpenCode, and Cursor read it too - skills aren't Claude-locked.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;skill-creator builds skills for you:&lt;/strong&gt; There's a skill whose only job is authoring skills. It interviews you about the workflow, scaffolds the folder, and writes a well-formed &lt;code&gt;SKILL.md&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skills and MCP are not rivals:&lt;/strong&gt; Skills are the recipe (what to do and how). MCP is the kitchen (live connections to tools and data). You use them together.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Have you ever explained the same thing to Claude for the fifth time? Your team's commit format. The way your company builds a PDF report. The exact steps to format a standup. You paste the same block of instructions into a fresh chat, again, because the model has no memory of the last four.&lt;/p&gt;

&lt;p&gt;Here's the thing: that repetition isn't a model limitation. It's a packaging problem. The knowledge already exists in your head, it just has nowhere to live where Claude can pick it up on demand.&lt;/p&gt;

&lt;p&gt;That's the gap Agent Skills fill. Anthropic shipped them on 16 October 2025, and the idea is refreshingly simple. A skill is a folder you hand to the agent, and it reads that folder only when the task calls for it. No fine-tuning, no plugin SDK, no re-explaining.&lt;/p&gt;

&lt;p&gt;Let's break this down from first principles: what a skill actually is, how it works, how to use one (and generate your own), and why it's a different thing from an MCP server, not a competitor to it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What an Agent Skill Actually Is
&lt;/h2&gt;

&lt;p&gt;Forget the marketing framing for a second. Fundamentally, an Agent Skill is a &lt;em&gt;directory on a filesystem&lt;/em&gt;. At its root sits one required file, &lt;code&gt;SKILL.md&lt;/code&gt;, and that's the entire minimum viable skill.&lt;/p&gt;

&lt;p&gt;Anthropic's own analogy is the best one: a skill is the onboarding guide you'd write for a new teammate - the instructions, reference material, and sometimes scripts they need to do a specific job the way your team does it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7iph7mu6xk94s881v0e2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7iph7mu6xk94s881v0e2.png" alt="Anatomy of a skill: a labeled folder tree with SKILL.md required plus optional reference files and scripts" width="800" height="461"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;SKILL.md&lt;/code&gt; has two parts. First, a block of YAML frontmatter with two required fields: a &lt;code&gt;name&lt;/code&gt; and a &lt;code&gt;description&lt;/code&gt;. Second, the body, which is plain markdown telling Claude how to do the task.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pdf-processing&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Extract&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;and&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;tables&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;from&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;PDFs,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;fill&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;forms,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;merge&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;documents.&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Use&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;when&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;working&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;with&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;PDF&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;files&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;or&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;forms."&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="gh"&gt;# PDF Processing&lt;/span&gt;
&lt;span class="gu"&gt;## Quick start&lt;/span&gt;
Use pdfplumber to extract text...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That &lt;code&gt;description&lt;/code&gt; field is doing more work than it looks. It's the &lt;em&gt;trigger&lt;/em&gt;, the text Claude matches your request against to decide whether the skill is relevant. So it has to state both what the skill does &lt;em&gt;and&lt;/em&gt; when to use it. Vague descriptions mean the skill never fires. (The rules are strict: &lt;code&gt;name&lt;/code&gt; maxes out at 64 lowercase-and-hyphen characters, &lt;code&gt;description&lt;/code&gt; at 1,024.)&lt;/p&gt;

&lt;p&gt;Beyond &lt;code&gt;SKILL.md&lt;/code&gt;, a skill can bundle whatever the job needs: extra markdown files (&lt;code&gt;FORMS.md&lt;/code&gt;, &lt;code&gt;REFERENCE.md&lt;/code&gt;), executable scripts (&lt;code&gt;fill_form.py&lt;/code&gt;), or raw resources like schemas and templates. None of it is required - the simplest useful skill is a single file.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Skills Work: Progressive Disclosure
&lt;/h2&gt;

&lt;p&gt;Here's where it gets interesting. If you install twenty skills, you might expect twenty manuals crammed into Claude's context window before you've typed a word, a disaster for both cost and focus.&lt;/p&gt;

&lt;p&gt;The fundamental issue skills solve is &lt;em&gt;context economy&lt;/em&gt;, and the mechanism is called &lt;strong&gt;progressive disclosure&lt;/strong&gt;. Claude loads information in three levels, each at a different moment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Metadata (always loaded).&lt;/strong&gt; At startup, Claude reads only the &lt;code&gt;name&lt;/code&gt; and &lt;code&gt;description&lt;/code&gt; of every installed skill, roughly 100 tokens each, into its system prompt. That's it. Twenty skills cost you a couple thousand tokens total, and Claude now knows what's available without knowing the details.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Instructions (loaded when triggered).&lt;/strong&gt; When your request matches a skill's description, Claude runs a bash command to read the full &lt;code&gt;SKILL.md&lt;/code&gt; body from disk. Only now do the actual instructions, kept under about 5k tokens, enter the context window.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Resources and code (loaded as needed).&lt;/strong&gt; Bundled files cost zero tokens until Claude actually opens them. Need the sales schema but not the forms guide? Claude reads only the schema. A skill can ship dozens of reference files with no context penalty for the ones a given task never touches.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F40mht1lrx1q204mssb39.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F40mht1lrx1q204mssb39.png" alt="Progressive disclosure: the three loading levels with their token costs" width="800" height="478"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The script handling is the part I like most. When a skill includes &lt;code&gt;validate_form.py&lt;/code&gt;, Claude runs it through bash and gets back only the output ("Validation passed" or an error), never the code itself. Because code is deterministic, that step is consistent and repeatable, and far cheaper than asking the model to regenerate equivalent logic on the fly. In real-world systems, that gap between "reason about it" and "just run the script" is often the gap between reliable and flaky.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using Skills (and the Skill That Writes Skills)
&lt;/h2&gt;

&lt;p&gt;From a practical standpoint, using a skill comes down to two things: put it where Claude can find it, and let the description do the triggering. You don't invoke a skill by name. Claude picks it up automatically when your request matches.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where a skill lives depends on the surface:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code:&lt;/strong&gt; drop the folder in &lt;code&gt;~/.claude/skills/&lt;/code&gt; (personal) or &lt;code&gt;.claude/skills/&lt;/code&gt; (project). It's pure filesystem, no upload.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;claude.ai:&lt;/strong&gt; upload a zip through Settings &amp;gt; Features (Pro, Max, Team, and Enterprise plans, with code execution on). Skills here are per-user.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The API / Agent SDK:&lt;/strong&gt; upload through the &lt;code&gt;/v1/skills&lt;/code&gt; endpoints and reference the &lt;code&gt;skill_id&lt;/code&gt;, running inside the code execution tool.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One honest caveat: skills don't sync across surfaces - upload one to claude.ai and it isn't automatically on the API. Same format, separate installs. Out of the box, Anthropic ships four pre-built document skills (PowerPoint, Excel, Word, PDF), plus partner skills from Canva, Notion, Figma, and Atlassian.&lt;/p&gt;

&lt;h3&gt;
  
  
  Let skill-creator do the scaffolding
&lt;/h3&gt;

&lt;p&gt;Now, writing a &lt;code&gt;SKILL.md&lt;/code&gt; by hand is easy to get subtly wrong: a weak description that never triggers, a bloated body, files that go unreferenced. So Anthropic built a skill whose entire job is building other skills: &lt;strong&gt;skill-creator&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Ask for it, and it interviews you about the workflow, generates the correct folder structure, writes a well-formed &lt;code&gt;SKILL.md&lt;/code&gt; with a trigger-optimized description, and bundles the resources you point it at. It's the fastest way to turn a repeatable process you keep narrating into something Claude just knows. Meta, but genuinely useful.&lt;/p&gt;

&lt;h2&gt;
  
  
  Skills vs MCP: The Recipe and the Kitchen
&lt;/h2&gt;

&lt;p&gt;This is the question I get most, so let's kill the confusion directly: &lt;strong&gt;Agent Skills and MCP are not competitors.&lt;/strong&gt; They operate at different layers, and the sharpest mental model I've seen is this: skills are the recipe, MCP is the kitchen.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7ue2byfhycdwuf98sj0z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7ue2byfhycdwuf98sj0z.png" alt="Skills vs MCP: a skill's three progressive-disclosure layers versus MCP's live client-server connection" width="800" height="678"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A skill is static procedural knowledge.&lt;/strong&gt; It's markdown and files sitting on a disk. It tells the agent &lt;em&gt;what to do and how to do it&lt;/em&gt;, your conventions, your workflow, your steps. It runs nothing on its own.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MCP (Model Context Protocol) is a live connection.&lt;/strong&gt; It's a client-server protocol, built on JSON-RPC, that plugs an agent into external tools and data through a running process with its own authentication and persistent state. It gives the agent &lt;em&gt;the infrastructure to actually do things&lt;/em&gt;: query the database, hit the API, read the ticket.&lt;/p&gt;

&lt;p&gt;The distinction that makes it click: does the thing change between calls? A live Salesforce connection, a database with fresh rows, an authenticated session, that's MCP. A workflow that stays stable for weeks, that's a skill.&lt;/p&gt;

&lt;p&gt;There's a cost angle too. Loading 50 MCP tools with full schemas can eat around 8,000 tokens before you start; a skill teaching the same patterns might cost 400. That's not an argument against MCP, it's an argument for right-sizing: use MCP for a live, authenticated, stateful connection, and a skill to teach a stable procedure. Better still, compose them - a skill can teach the agent how to use the very tools an MCP server exposes, which is exactly where Anthropic's own guidance points.&lt;/p&gt;

&lt;h2&gt;
  
  
  Skills Aren't Locked to Claude
&lt;/h2&gt;

&lt;p&gt;Here's a detail that gets missed: the format isn't proprietary. Anthropic published &lt;code&gt;SKILL.md&lt;/code&gt; as an open standard, and the ecosystem adopted it fast. The same skill file now works unmodified across Claude Code, OpenAI's Codex, OpenCode, Cursor, and Gemini CLI - more than twenty agents read it. Write a skill once and it travels with you, whatever tool or model you're driving. Your know-how stops being locked to one vendor.&lt;/p&gt;

&lt;p&gt;That portability also means a growing marketplace of community skills. Directories like &lt;a href="https://www.skillhub.club/skills" rel="noopener noreferrer"&gt;SkillHub&lt;/a&gt; catalog thousands of ready-made skills you can drop in within seconds - a genuinely useful place to see what a good &lt;code&gt;SKILL.md&lt;/code&gt; looks like.&lt;/p&gt;

&lt;p&gt;But here's the critical caveat, and I won't soften it: installing a skill is executing trust. A skill can run code and invoke tools on your machine, so a bad one is a security problem, not a bad download. Malicious and low-quality skills exist. Before you install anything from a directory, open the &lt;code&gt;SKILL.md&lt;/code&gt; and every bundled script and read them, exactly as you'd vet someone else's software before running it.&lt;/p&gt;

&lt;p&gt;From a practical standpoint, the safest path - and the one I default to - is to build the skill yourself with skill-creator. You get exactly the behavior you want, and there's nothing to audit because you wrote it. Browse the marketplaces for ideas; write the ones you'll actually rely on.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Are Agent Skills free to use?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The format itself is free and open. Creating skills in Claude Code costs nothing beyond your normal usage. On claude.ai, custom skills need a paid plan (Pro, Max, Team, or Enterprise) with code execution enabled, and via the API you pay for the underlying code execution and tokens as usual.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do I need to know how to code to build a skill?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. A skill can be pure markdown, instructions in plain English. Scripts are optional, for the parts where deterministic code beats asking the model to improvise. And skill-creator will scaffold the whole thing for you through a conversation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where does my data go when a skill runs?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It depends on the surface. On the API, skills execute in a sandboxed container with no network access, so they can't call out to the internet on their own. In Claude Code they run with the same network access as any program on your machine, which is more capable and worth respecting. One thing to note: Agent Skills aren't covered by zero-data-retention arrangements, so execution data follows Anthropic's standard retention policy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How is a skill different from just a good prompt?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A prompt is conversation-level. It lives and dies with one chat. A skill is reusable and loads on demand across every conversation, without you pasting anything. And thanks to progressive disclosure, you can keep many skills installed with almost no standing context cost.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Changes How You Work With Claude
&lt;/h2&gt;

&lt;p&gt;Step back and the bigger picture comes into focus. For a while, making an AI genuinely useful for &lt;em&gt;your&lt;/em&gt; work meant either fine-tuning a model or wiring up bespoke integrations. Skills collapse that into something anyone can do: write down how you work, in a folder, once.&lt;/p&gt;

&lt;p&gt;That's a quiet but real shift. The value moves from the model's raw capability toward the procedural knowledge you package around it - your commit conventions, your report format, your security-review steps, the stuff that makes the work &lt;em&gt;yours&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Ask yourself what you re-explain to Claude every week. That's your first skill. Run skill-creator on it, and watch Claude pick it up on its own next time. Then reach for MCP when you need live tools underneath it. Build the recipe first; the kitchen comes when the cooking gets real.&lt;/p&gt;

&lt;p&gt;P.S. If you want to go straight to the source, read Anthropic's engineering deep-dive on &lt;a href="https://www.anthropic.com/engineering/equipping-agents-for-the-real-world-with-agent-skills" rel="noopener noreferrer"&gt;Agent Skills&lt;/a&gt; and browse the open-source examples in the &lt;a href="https://github.com/anthropics/skills" rel="noopener noreferrer"&gt;anthropics/skills repository&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://blog.stratoslouvaris.gr/agent-skills-explained/" rel="noopener noreferrer"&gt;blog.stratoslouvaris.gr&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I write about building AI agents that work in production, and what breaks along the way.&lt;br&gt;
&lt;a href="https://blog.stratoslouvaris.gr/#/portal/signup" rel="noopener noreferrer"&gt;Subscribe to the newsletter&lt;/a&gt; or find me on &lt;a href="https://www.linkedin.com/in/stratos-louvaris/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>agents</category>
      <category>mcp</category>
    </item>
  </channel>
</rss>
