<?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: Lisandro Reinoso</title>
    <description>The latest articles on DEV Community by Lisandro Reinoso (@lisandro_reinoso_d12ac7b9).</description>
    <link>https://dev.to/lisandro_reinoso_d12ac7b9</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%2F4121361%2F75a7fbf5-cc44-4d69-ae7a-be25e934dfe6.png</url>
      <title>DEV Community: Lisandro Reinoso</title>
      <link>https://dev.to/lisandro_reinoso_d12ac7b9</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lisandro_reinoso_d12ac7b9"/>
    <language>en</language>
    <item>
      <title>Anatomy of a skill</title>
      <dc:creator>Lisandro Reinoso</dc:creator>
      <pubDate>Fri, 11 Sep 2026 22:50:34 +0000</pubDate>
      <link>https://dev.to/lisandro_reinoso_d12ac7b9/anatomy-of-a-skill-295g</link>
      <guid>https://dev.to/lisandro_reinoso_d12ac7b9/anatomy-of-a-skill-295g</guid>
      <description>&lt;p&gt;This started with a surprise, not with a plan. I needed a survey of the state of the art on a topic I was considering working on, so I ran &lt;code&gt;deep-research&lt;/code&gt;, a skill that ships with Claude Code, and it came back with a report I didn't expect from a single run —27 sources, 123 claims extracted, 25 verified, and of those 18 confirmed and 7 refuted— with an executive summary, caveats, and open questions. What struck me wasn't the volume (I already covered the 109 agents in the previous post) but that all of it came out of &lt;strong&gt;a single skill&lt;/strong&gt;. I wanted to see how it was built.&lt;/p&gt;

&lt;p&gt;It wasn't easy to find: it doesn't live in &lt;code&gt;.claude/skills/&lt;/code&gt; or in &lt;code&gt;~/.claude&lt;/code&gt;. It's compiled into the Claude Code binary as a &lt;em&gt;bundled workflow&lt;/em&gt;, and a comment in the code tells its origin: &lt;em&gt;"Ported from bughunter architecture"&lt;/em&gt;. It's 349 lines of JavaScript. Reading them was the research.&lt;/p&gt;

&lt;h2&gt;
  
  
  How a prompt is written
&lt;/h2&gt;

&lt;p&gt;Inside there are three prompts, and all three follow the same shape: a &lt;strong&gt;role&lt;/strong&gt; in the title, the &lt;strong&gt;context&lt;/strong&gt; (the original question plus the specific input), a &lt;strong&gt;task&lt;/strong&gt; as a numbered checklist, an explicit &lt;strong&gt;decision criterion&lt;/strong&gt;, and the &lt;strong&gt;output format&lt;/strong&gt;. The verifier is the clearest one:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;VERIFY_PROMPT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;claim&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;## Adversarial Claim Verifier (voter &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;v&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/3)&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Be SKEPTICAL. Try to REFUTE this claim. ≥2/3 refutations kill it.&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;## Claim under review&lt;/span&gt;&lt;span class="se"&gt;\n\"&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;claim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;claim&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\"\n&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;**Supporting quote:** &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;claim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;quote&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\"\n\n&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;## Checklist&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1. Is the claim actually supported by the quote, or is it an overreach?&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2. WebSearch for contradicting evidence.&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;3. Is the source quality sufficient for the claim's strength?&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;4. Is the claim outdated?&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;5. Is this a marketing claim / cherry-picked benchmark / forum speculation?&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;**refuted=false** ONLY if: well-supported, current, and source quality matches claim strength.&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Default to refuted=true if uncertain.&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s2"&gt;Structured output only. Evidence MUST be specific.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's exactly the framework I use when I review one of my own prompts —role, context, task, format, constraints— but with two details I don't usually include: the decision criterion is written as a rule (&lt;code&gt;refuted=false&lt;/code&gt; &lt;strong&gt;only&lt;/strong&gt; if…) and ties resolve by default toward the conservative side (&lt;em&gt;"Default to refuted=true if uncertain"&lt;/em&gt;). A prompt that doesn't say what to do when in doubt leaves that decision to the model, and that's where the tidy-but-unfounded answers show up.&lt;/p&gt;

&lt;h2&gt;
  
  
  How a skill is built
&lt;/h2&gt;

&lt;p&gt;A skill is more than a long prompt. What I saw in the file falls into six pieces:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Trigger metadata.&lt;/strong&gt; The &lt;code&gt;meta&lt;/code&gt; declares the name, the description, and the five phases, but the key is &lt;code&gt;whenToUse&lt;/code&gt;: it's what the model reads to decide whether to invoke the skill, and it includes a prior instruction —if the question is underspecified, ask two or three clarifying questions before starting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Tuning constants at the top.&lt;/strong&gt; No magic numbers buried in the code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;VOTES_PER_CLAIM&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;REFUTATIONS_REQUIRED&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;MAX_FETCH&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;MAX_VERIFY_CLAIMS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. One schema per agent.&lt;/strong&gt; Each of the five agent types returns JSON validated against a schema. That's what makes the pipeline composable: one agent's output is the next one's typed input.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Prompts as functions.&lt;/strong&gt; &lt;code&gt;SEARCH_PROMPT(angle)&lt;/code&gt;, &lt;code&gt;FETCH_PROMPT(source, angle)&lt;/code&gt;, &lt;code&gt;VERIFY_PROMPT(claim, v)&lt;/code&gt;: they take the input and return the text. The prompt isn't copied, it's instantiated.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Explicit orchestration.&lt;/strong&gt; Search and fetch go through &lt;code&gt;pipeline()&lt;/code&gt;: each angle moves on to fetching its sources as soon as it's done, without waiting for the others. Before verification there's a barrier —and the comment says so: &lt;em&gt;"Barrier here is intentional"&lt;/em&gt;— because the pool of claims has to be complete before it can be ranked. Then, nested &lt;code&gt;parallel()&lt;/code&gt;: 25 claims × 3 votes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Defensive design.&lt;/strong&gt; Every early exit (no claims, everything refuted, failed synthesis) returns a useful result with &lt;code&gt;stats&lt;/code&gt; instead of throwing. A &lt;code&gt;null&lt;/code&gt; vote counts as an abstention, not as a free pass:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;survives&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;valid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="nx"&gt;REFUTATIONS_REQUIRED&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;refuted&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;REFUTATIONS_REQUIRED&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And the final result carries &lt;code&gt;agentCalls&lt;/code&gt;: the skill computes its own cost (&lt;code&gt;1 + angles + sources + claims × 3 + 1&lt;/code&gt;). That's where the 109 came from.&lt;/p&gt;

&lt;h2&gt;
  
  
  Trimming the pattern
&lt;/h2&gt;

&lt;p&gt;The proof that I understood the pattern was reusing it. A couple of later runs on that same topic got cut off by the session limit before verification, and instead of repeating them in full I wrote &lt;code&gt;reverify-linea-c&lt;/code&gt;: same &lt;code&gt;meta&lt;/code&gt;, same constants, same verdict schema, and the same three-vote verifier, but with no Scope, Search, or Fetch —those phases were replaced by an array of 22 already-extracted claims. The whole skeleton inherited, one array of my own. All 22 came back confirmed.&lt;/p&gt;

&lt;p&gt;What I take away: a good skill isn't a long prompt, it's a short, well-formed prompt, instantiated many times by an orchestration that knows where to wait and where not to, and that measures what it spends. And it reads in an afternoon.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
