<?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: Driftproofhq</title>
    <description>The latest articles on DEV Community by Driftproofhq (@driftproofhq).</description>
    <link>https://dev.to/driftproofhq</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%2F4134439%2F790a1501-5d8a-4f38-ae9f-3e743c371d99.png</url>
      <title>DEV Community: Driftproofhq</title>
      <link>https://dev.to/driftproofhq</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/driftproofhq"/>
    <language>en</language>
    <item>
      <title>The biggest improvement in my skill evaluation came from a skill that was never invoked</title>
      <dc:creator>Driftproofhq</dc:creator>
      <pubDate>Sun, 20 Sep 2026 17:59:55 +0000</pubDate>
      <link>https://dev.to/driftproofhq/the-biggest-improvement-in-my-skill-evaluation-came-from-a-skill-that-was-never-invoked-30jf</link>
      <guid>https://dev.to/driftproofhq/the-biggest-improvement-in-my-skill-evaluation-came-from-a-skill-that-was-never-invoked-30jf</guid>
      <description>&lt;p&gt;Last week I measured three agent skills twice over: once with Claude Code's built-in &lt;code&gt;claude plugin eval&lt;/code&gt;, and once with a runner I maintain. Same skill text, same task prompts, same rubrics.&lt;/p&gt;

&lt;p&gt;I expected the interesting part to be which tool scored higher. It wasn't. The interesting part was a result that looked excellent and turned out to be unattributable.&lt;/p&gt;

&lt;h2&gt;
  
  
  The setup
&lt;/h2&gt;

&lt;p&gt;Three skills from the public &lt;code&gt;addyosmani/agent-skills&lt;/code&gt; pack: code review and quality, git workflow and versioning, documentation and ADRs. One case each, every case run twice, once with the skill and once without.&lt;/p&gt;

&lt;p&gt;The two tools do not do the same thing, and that matters for everything below.&lt;/p&gt;

&lt;p&gt;The built-in eval installs the skill as a real plugin. The model has to discover it and call it through the Skill tool, the task runs with tools in a workspace, and each run is graded pass or fail. Three runs per arm.&lt;/p&gt;

&lt;p&gt;My runner puts the SKILL.md text straight into context, so exposure is guaranteed, and scores the answer continuously from 0 to 1 across several draws per arm. It does not test discovery at all.&lt;/p&gt;

&lt;p&gt;So one measures discovery plus application plus execution, and the other measures application given guaranteed exposure. Target model and judge were claude-opus-5 in both.&lt;/p&gt;

&lt;h2&gt;
  
  
  The result that started this
&lt;/h2&gt;

&lt;p&gt;Documentation and ADRs produced the largest apparent benefit in the whole run. Three of three tasks passed with the plugin, one of three without it.&lt;/p&gt;

&lt;p&gt;Then I read the traces. The Skill tool was not called in any of those three runs. I added a supplementary run to be sure. It was not called there either. Zero of three, and zero of one.&lt;/p&gt;

&lt;p&gt;Something differed between the two arms. The evidence does not say the skill is what differed. With three runs, two failures in the baseline arm are enough to produce a result that reads like a large effect, and nothing in the record ties the passing arm's behaviour to the skill firing.&lt;/p&gt;

&lt;p&gt;That is not the built-in eval being wrong. Its output simply cannot support the causal reading, which is a different problem and a more common one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The opposite failure, one skill down
&lt;/h2&gt;

&lt;p&gt;Code review and quality showed no benefit at all: three of three passing in both arms, a delta of exactly zero.&lt;/p&gt;

&lt;p&gt;Scored continuously on the same inputs, the same skill read 0.918 with it against 0.783 without.&lt;/p&gt;

&lt;p&gt;Both arms had cleared the pass threshold, so pass/fail had nothing left to report. A zero delta there means the test could not see a difference, not that there wasn't one.&lt;/p&gt;

&lt;h2&gt;
  
  
  A third way to pass while being wrong
&lt;/h2&gt;

&lt;p&gt;Separately I ran the whole plugin over three tool-using tasks: review a working tree change, make atomic commits, write an ADR in the repository's own convention. Three runs per arm.&lt;/p&gt;

&lt;p&gt;Every session passed. Eighteen of eighteen against the native graders, nine with the plugin and nine without, and eighteen of eighteen against post-session verification.&lt;/p&gt;

&lt;p&gt;One of the ADRs passed every structural check while asserting a history the fixture never supplied. The file existed, the format was right, the tools had been used, every deterministic check was green, and part of the content was invented.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this does not prove
&lt;/h2&gt;

&lt;p&gt;One case per skill, so these are effects on those cases and not on the skills in general.&lt;/p&gt;

&lt;p&gt;Three runs per arm in the native tool, so a single run moves a pass rate by 33 points.&lt;/p&gt;

&lt;p&gt;The two tools measure different things, and I do not compare their numbers with each other.&lt;/p&gt;

&lt;p&gt;The ± figures from my runner are the sample standard deviation across draws, a descriptive spread with no coverage probability. Nothing here is a significance claim.&lt;/p&gt;

&lt;p&gt;The same model generated and judged, which I did to match the native setup and which carries an obvious self-preference risk.&lt;/p&gt;

&lt;p&gt;None of that makes the findings useless. It makes them exploratory, which is what one case per skill can support.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I check now
&lt;/h2&gt;

&lt;p&gt;Two things, before reading any with-and-without number.&lt;/p&gt;

&lt;p&gt;Was the skill invoked at all in the with arm? If activation is not recorded anywhere, the difference is not attributable to the skill, whatever its size.&lt;/p&gt;

&lt;p&gt;Did both arms sit at the ceiling? If everything passed either way, the task was not hard enough to answer the question being asked.&lt;/p&gt;

&lt;p&gt;Neither check needs my tooling. Both are readable from what the built-in eval already produces.&lt;/p&gt;

&lt;h2&gt;
  
  
  Someone else hit this from the other side
&lt;/h2&gt;

&lt;p&gt;While I was writing this up, the Superpowers plugin shipped a rebuild of its executing-plans skill after measuring the old one as, in the maintainer's words, "indistinguishable from running with no plugin at all": same tokens, same duration, same shipped bug, every repetition. The measurement is in &lt;a href="https://github.com/obra/superpowers/pull/2318" rel="noopener noreferrer"&gt;the pull request&lt;/a&gt;. A maintainer publishing a negative result about their own skill is rarer than it should be.&lt;/p&gt;

&lt;p&gt;OpenAI's developer post on &lt;a href="https://developers.openai.com/blog/rethinking-skills-and-prompts-for-gpt-6-astra" rel="noopener noreferrer"&gt;rethinking skills and prompts for GPT-6 Astra&lt;/a&gt; makes a related point from the model side: guidance written for an older model can cost you rather than help you, so a release is a reason to recheck what you already shipped.&lt;/p&gt;

&lt;h2&gt;
  
  
  The artefacts
&lt;/h2&gt;

&lt;p&gt;Both tools' raw output, every CLI call and the receipt-to-output hash audit are published with the write-up: &lt;a href="https://driftproofhq.com/reports/009/" rel="noopener noreferrer"&gt;driftproofhq.com/reports/009&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Happy to answer methodology questions.&lt;/p&gt;

&lt;p&gt;Disclosure: the continuous runner is Driftproof, which I build and maintain (open source, Apache 2.0). The built-in eval is Anthropic's.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>testing</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
