<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Codex Cli Skills on RockB</title><link>https://baeseokjae.github.io/tags/codex-cli-skills/</link><description>Recent content in Codex Cli Skills on RockB</description><image><title>RockB</title><url>https://baeseokjae.github.io/images/og-default.png</url><link>https://baeseokjae.github.io/images/og-default.png</link></image><generator>Hugo</generator><language>en-us</language><lastBuildDate>Tue, 04 Aug 2026 15:42:44 +0000</lastBuildDate><atom:link href="https://baeseokjae.github.io/tags/codex-cli-skills/index.xml" rel="self" type="application/rss+xml"/><item><title>I Still Don't Understand Why AI Agents Need Skills — Here's the Real Answer</title><link>https://baeseokjae.github.io/posts/ai-agents-need-skills-ask-hn-2026/</link><pubDate>Tue, 04 Aug 2026 15:42:44 +0000</pubDate><guid>https://baeseokjae.github.io/posts/ai-agents-need-skills-ask-hn-2026/</guid><description>AI agents need skills because dumping all instructions into one file pollutes the context window. Skills use progressive disclosure to load only relevant knowledge, improving performance and security.</description><content:encoded><![CDATA[<p>AI agents need skills because a single monolithic instruction file like <code>AGENTS.md</code> forces the entire knowledge base into the agent&rsquo;s context window on every interaction, degrading performance, increasing cost, and reducing accuracy. Skills solve this by using <strong>progressive disclosure</strong> — the agent sees only a skill&rsquo;s name and description upfront, and loads the full instructions only when it decides the skill is relevant. This architectural pattern, borrowed from how human experts organize knowledge, is the difference between handing someone a 500-page manual and letting them ask for the chapter they need.</p>
<h2 id="the-question-that-started-it-all">The Question That Started It All</h2>
<p>In mid-2026, a Hacker News user posting as <code>skeptic_ai</code> asked a question that resonated with hundreds of developers: <em>&ldquo;I still don&rsquo;t understand why AI agents need skills. Couldn&rsquo;t I just have an AGENTS.md that points to folders of .md files?&rdquo;</em></p>
<p>The post earned 17 points and 25+ comments — significant engagement for a technical question on HN. The skepticism was genuine and well-reasoned. If an AI agent can already read files, why add a whole skill abstraction layer? Why not just organize your Markdown files in folders and let the agent browse them?</p>
<p>It&rsquo;s a fair question, and it deserves a real answer — not marketing fluff. Let&rsquo;s break down exactly what skills are, why they exist, and whether the skeptic was right.</p>
<h2 id="what-are-skills-really">What Are Skills, Really?</h2>
<p>At their core, AI agent skills are <strong>lazy-loaded, progressively-disclosed Markdown documents with structured metadata</strong>. The most widely adopted format — pioneered by Anthropic&rsquo;s Claude Code — uses YAML front-matter (name, description, optional allowed-tools) followed by a Markdown body containing the actual instructions.</p>
<p>Here&rsquo;s what a typical skill looks like:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span>---
</span></span><span style="display:flex;"><span><span style="color:#f92672">name</span>: <span style="color:#ae81ff">react-testing</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">description</span>: <span style="color:#ae81ff">Expert guidance for testing React components with Jest and React Testing Library</span>
</span></span><span style="display:flex;"><span>---
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">When writing React component tests, follow these patterns</span>:
</span></span><span style="display:flex;"><span>- <span style="color:#ae81ff">Use `render()` from @testing-library/react</span>
</span></span><span style="display:flex;"><span>- <span style="color:#ae81ff">Prefer `screen.getByRole()` over `getByTestId()`</span>
</span></span><span style="display:flex;"><span>- <span style="color:#ae81ff">Test behavior, not implementation</span>
</span></span><span style="display:flex;"><span>...
</span></span></code></pre></div><p>The key architectural insight is <strong>what the agent sees and when</strong>. When an agent starts a task, it loads only the <strong>name</strong> and <strong>description</strong> of every available skill — a lightweight index that fits in a few hundred tokens. The agent then decides which skills are relevant to the current task and requests the full body only for those. This is called progressive disclosure, and it&rsquo;s the entire point of the abstraction.</p>
<h3 id="skills-vs-agentsmd-a-comparison">Skills vs. AGENTS.md: A Comparison</h3>
<table>
  <thead>
      <tr>
          <th>Feature</th>
          <th>AGENTS.md (Monolithic)</th>
          <th>Skills (Progressive Disclosure)</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Initial context cost</td>
          <td>Full file loaded every time</td>
          <td>Names + descriptions only (~200 tokens)</td>
      </tr>
      <tr>
          <td>Relevance filtering</td>
          <td>Manual — you read the whole thing</td>
          <td>Automatic — agent selects what it needs</td>
      </tr>
      <tr>
          <td>Composability</td>
          <td>One file, one purpose</td>
          <td>Multiple skills, mix and match</td>
      </tr>
      <tr>
          <td>Versioning</td>
          <td>Git history on one file</td>
          <td>Per-skill versioning possible</td>
      </tr>
      <tr>
          <td>Security boundaries</td>
          <td>None — all instructions visible</td>
          <td>Front-matter can restrict tools</td>
      </tr>
      <tr>
          <td>Community sharing</td>
          <td>Copy-paste</td>
          <td>Registry-ready format</td>
      </tr>
      <tr>
          <td>Maintenance</td>
          <td>Single file grows unbounded</td>
          <td>Modular, independently updatable</td>
      </tr>
  </tbody>
</table>
<h2 id="why-not-just-agentsmd">Why Not Just AGENTS.md?</h2>
<p>The skeptic&rsquo;s proposal — a single <code>AGENTS.md</code> that points to folders of <code>.md</code> files — sounds reasonable until you understand how LLM context windows actually work.</p>
<h3 id="the-context-pollution-problem">The Context Pollution Problem</h3>
<p>Every token in the context window consumes attention budget. When you dump a 10,000-token instruction file into an agent&rsquo;s context, you&rsquo;re not just paying for the tokens — you&rsquo;re actively degrading the agent&rsquo;s ability to focus on the actual task. This is called <strong>context pollution</strong>, and it&rsquo;s measurable.</p>
<p>As HN user <code>thiago_fm</code> put it in the discussion: <em>&ldquo;Loading all instructions into context degrades LLM performance. The key architectural reason for skills is context window management.&rdquo;</em></p>
<p>Research bears this out. LLM performance on focused tasks drops measurably when irrelevant context is present. A 2024 study on in-context learning showed that adding irrelevant but plausible information reduced accuracy by 15-30% across multiple model families. Skills prevent this by keeping the context lean.</p>
<h3 id="the-scaling-problem">The Scaling Problem</h3>
<p>A single <code>AGENTS.md</code> works for a small project with 3-5 instructions. But real-world agent deployments accumulate knowledge rapidly:</p>
<ul>
<li>Project conventions</li>
<li>Testing patterns</li>
<li>Deployment workflows</li>
<li>API documentation</li>
<li>Security policies</li>
<li>Code review guidelines</li>
<li>Database schemas</li>
<li>Environment-specific instructions</li>
</ul>
<p>A production agent at a mid-size company might need 50+ distinct instruction sets. Loading all of them simultaneously would consume 30,000-50,000 tokens before the agent even starts working. Skills keep the active context at a fraction of that.</p>
<h3 id="the-composability-problem">The Composability Problem</h3>
<p>Monolithic files don&rsquo;t compose. If you have a React testing skill and a Python backend skill, an <code>AGENTS.md</code> approach forces you to either:</p>
<ol>
<li>Put everything in one file (context pollution)</li>
<li>Have the agent read multiple files on every task (slow, wasteful)</li>
<li>Maintain separate agents for separate domains (operational overhead)</li>
</ol>
<p>Skills solve this cleanly: the agent loads the React testing skill when it&rsquo;s writing frontend tests, and the Python backend skill when it&rsquo;s working on API routes. Both can coexist in the same agent without conflict.</p>
<h2 id="the-open-standard-how-claude-codes-skill-format-became-cross-platform">The Open Standard: How Claude Code&rsquo;s Skill Format Became Cross-Platform</h2>
<p>What started as a Claude Code feature has become a de facto open standard. The Claude Code skills format — YAML front-matter plus Markdown body — is now adopted by Codex CLI, Cursor, and a growing ecosystem of AI coding tools.</p>
<p>Robert Glaser documented this transition in his analysis of Claude Skills in Codex CLI: <em>&ldquo;Non-Claude agents like Codex CLI can adopt the same format with a small enumerator script. The skills directory structure — SKILL.md with front-matter, body loaded only when relevant — works across platforms.&rdquo;</em></p>
<p>This cross-platform adoption matters because it creates a <strong>portable skill ecosystem</strong>. A skill written for Claude Code can be used by Codex CLI, and vice versa. The format is simple enough that any agent framework can implement it with minimal engineering effort.</p>
<h3 id="the-skill-directory-structure">The Skill Directory Structure</h3>
<p>The standard layout is straightforward:</p>



<div class="goat svg-container ">
  
    <svg
      xmlns="http://www.w3.org/2000/svg"
      font-family="Menlo,Lucida Console,monospace"
      
        viewBox="0 0 176 153"
      >
      <g transform='translate(8,16)'>
<text text-anchor='middle' x='0' y='4' fill='currentColor' style='font-size:1em'>~</text>
<text text-anchor='middle' x='0' y='20' fill='currentColor' style='font-size:1em'>├</text>
<text text-anchor='middle' x='0' y='36' fill='currentColor' style='font-size:1em'>│</text>
<text text-anchor='middle' x='0' y='52' fill='currentColor' style='font-size:1em'>├</text>
<text text-anchor='middle' x='0' y='68' fill='currentColor' style='font-size:1em'>│</text>
<text text-anchor='middle' x='0' y='84' fill='currentColor' style='font-size:1em'>├</text>
<text text-anchor='middle' x='0' y='100' fill='currentColor' style='font-size:1em'>│</text>
<text text-anchor='middle' x='0' y='116' fill='currentColor' style='font-size:1em'>└</text>
<text text-anchor='middle' x='8' y='4' fill='currentColor' style='font-size:1em'>/</text>
<text text-anchor='middle' x='8' y='20' fill='currentColor' style='font-size:1em'>─</text>
<text text-anchor='middle' x='8' y='52' fill='currentColor' style='font-size:1em'>─</text>
<text text-anchor='middle' x='8' y='84' fill='currentColor' style='font-size:1em'>─</text>
<text text-anchor='middle' x='8' y='116' fill='currentColor' style='font-size:1em'>─</text>
<text text-anchor='middle' x='16' y='4' fill='currentColor' style='font-size:1em'>.</text>
<text text-anchor='middle' x='16' y='20' fill='currentColor' style='font-size:1em'>─</text>
<text text-anchor='middle' x='16' y='52' fill='currentColor' style='font-size:1em'>─</text>
<text text-anchor='middle' x='16' y='84' fill='currentColor' style='font-size:1em'>─</text>
<text text-anchor='middle' x='16' y='116' fill='currentColor' style='font-size:1em'>─</text>
<text text-anchor='middle' x='24' y='4' fill='currentColor' style='font-size:1em'>h</text>
<text text-anchor='middle' x='32' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='32' y='20' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='32' y='36' fill='currentColor' style='font-size:1em'>└</text>
<text text-anchor='middle' x='32' y='52' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='32' y='68' fill='currentColor' style='font-size:1em'>└</text>
<text text-anchor='middle' x='32' y='84' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='32' y='100' fill='currentColor' style='font-size:1em'>└</text>
<text text-anchor='middle' x='32' y='116' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='32' y='132' fill='currentColor' style='font-size:1em'>└</text>
<text text-anchor='middle' x='40' y='4' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='40' y='20' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='40' y='36' fill='currentColor' style='font-size:1em'>─</text>
<text text-anchor='middle' x='40' y='52' fill='currentColor' style='font-size:1em'>y</text>
<text text-anchor='middle' x='40' y='68' fill='currentColor' style='font-size:1em'>─</text>
<text text-anchor='middle' x='40' y='84' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='40' y='100' fill='currentColor' style='font-size:1em'>─</text>
<text text-anchor='middle' x='40' y='116' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='40' y='132' fill='currentColor' style='font-size:1em'>─</text>
<text text-anchor='middle' x='48' y='4' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='48' y='20' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='48' y='36' fill='currentColor' style='font-size:1em'>─</text>
<text text-anchor='middle' x='48' y='52' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='48' y='68' fill='currentColor' style='font-size:1em'>─</text>
<text text-anchor='middle' x='48' y='84' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='48' y='100' fill='currentColor' style='font-size:1em'>─</text>
<text text-anchor='middle' x='48' y='116' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='48' y='132' fill='currentColor' style='font-size:1em'>─</text>
<text text-anchor='middle' x='56' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='56' y='20' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='56' y='52' fill='currentColor' style='font-size:1em'>h</text>
<text text-anchor='middle' x='56' y='84' fill='currentColor' style='font-size:1em'>k</text>
<text text-anchor='middle' x='56' y='116' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='64' y='4' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='64' y='20' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='64' y='36' fill='currentColor' style='font-size:1em'>S</text>
<text text-anchor='middle' x='64' y='52' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='64' y='68' fill='currentColor' style='font-size:1em'>S</text>
<text text-anchor='middle' x='64' y='84' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='64' y='100' fill='currentColor' style='font-size:1em'>S</text>
<text text-anchor='middle' x='64' y='116' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='64' y='132' fill='currentColor' style='font-size:1em'>S</text>
<text text-anchor='middle' x='72' y='4' fill='currentColor' style='font-size:1em'>/</text>
<text text-anchor='middle' x='72' y='20' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='72' y='36' fill='currentColor' style='font-size:1em'>K</text>
<text text-anchor='middle' x='72' y='52' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='72' y='68' fill='currentColor' style='font-size:1em'>K</text>
<text text-anchor='middle' x='72' y='84' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='72' y='100' fill='currentColor' style='font-size:1em'>K</text>
<text text-anchor='middle' x='72' y='116' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='72' y='132' fill='currentColor' style='font-size:1em'>K</text>
<text text-anchor='middle' x='80' y='4' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='80' y='20' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='80' y='36' fill='currentColor' style='font-size:1em'>I</text>
<text text-anchor='middle' x='80' y='52' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='80' y='68' fill='currentColor' style='font-size:1em'>I</text>
<text text-anchor='middle' x='80' y='84' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='80' y='100' fill='currentColor' style='font-size:1em'>I</text>
<text text-anchor='middle' x='80' y='116' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='80' y='132' fill='currentColor' style='font-size:1em'>I</text>
<text text-anchor='middle' x='88' y='4' fill='currentColor' style='font-size:1em'>k</text>
<text text-anchor='middle' x='88' y='20' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='88' y='36' fill='currentColor' style='font-size:1em'>L</text>
<text text-anchor='middle' x='88' y='52' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='88' y='68' fill='currentColor' style='font-size:1em'>L</text>
<text text-anchor='middle' x='88' y='84' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='88' y='100' fill='currentColor' style='font-size:1em'>L</text>
<text text-anchor='middle' x='88' y='116' fill='currentColor' style='font-size:1em'>y</text>
<text text-anchor='middle' x='88' y='132' fill='currentColor' style='font-size:1em'>L</text>
<text text-anchor='middle' x='96' y='4' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='96' y='20' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='96' y='36' fill='currentColor' style='font-size:1em'>L</text>
<text text-anchor='middle' x='96' y='52' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='96' y='68' fill='currentColor' style='font-size:1em'>L</text>
<text text-anchor='middle' x='96' y='84' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='96' y='100' fill='currentColor' style='font-size:1em'>L</text>
<text text-anchor='middle' x='96' y='116' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='96' y='132' fill='currentColor' style='font-size:1em'>L</text>
<text text-anchor='middle' x='104' y='4' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='104' y='20' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='104' y='36' fill='currentColor' style='font-size:1em'>.</text>
<text text-anchor='middle' x='104' y='52' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='104' y='68' fill='currentColor' style='font-size:1em'>.</text>
<text text-anchor='middle' x='104' y='84' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='104' y='100' fill='currentColor' style='font-size:1em'>.</text>
<text text-anchor='middle' x='104' y='116' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='104' y='132' fill='currentColor' style='font-size:1em'>.</text>
<text text-anchor='middle' x='112' y='4' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='112' y='20' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='112' y='36' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='112' y='52' fill='currentColor' style='font-size:1em'>k</text>
<text text-anchor='middle' x='112' y='68' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='112' y='84' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='112' y='100' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='112' y='116' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='112' y='132' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='120' y='4' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='120' y='20' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='120' y='36' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='120' y='52' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='120' y='68' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='120' y='84' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='120' y='100' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='120' y='116' fill='currentColor' style='font-size:1em'>v</text>
<text text-anchor='middle' x='120' y='132' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='128' y='4' fill='currentColor' style='font-size:1em'>/</text>
<text text-anchor='middle' x='128' y='20' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='128' y='52' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='128' y='84' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='128' y='116' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='136' y='20' fill='currentColor' style='font-size:1em'>/</text>
<text text-anchor='middle' x='136' y='52' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='136' y='84' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='136' y='116' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='144' y='52' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='144' y='84' fill='currentColor' style='font-size:1em'>/</text>
<text text-anchor='middle' x='144' y='116' fill='currentColor' style='font-size:1em'>w</text>
<text text-anchor='middle' x='152' y='52' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='152' y='116' fill='currentColor' style='font-size:1em'>/</text>
<text text-anchor='middle' x='160' y='52' fill='currentColor' style='font-size:1em'>/</text>
</g>

    </svg>
  
</div>
<p>Each skill is a directory containing a <code>SKILL.md</code> file with YAML front-matter. Some implementations also support supporting files — scripts, templates, reference documents — bundled alongside the skill.</p>
<h2 id="beyond-markdown-skills-that-bundle-executable-behavior">Beyond Markdown: Skills That Bundle Executable Behavior</h2>
<p>One of the most compelling arguments for skills over plain Markdown is that skills can bundle <strong>deterministic scripts and artifacts</strong>, not just text instructions.</p>
<p>As HN user <code>alexhans</code> noted: <em>&ldquo;Skills can bundle deterministic scripts and artifacts (not just markdown), enabling executable behavior beyond prompting.&rdquo;</em></p>
<p>This means a skill can include:</p>
<ul>
<li><strong>Validation scripts</strong> that run automatically when the skill is activated</li>
<li><strong>Code generators</strong> that scaffold project structures</li>
<li><strong>Linting configurations</strong> that enforce project conventions</li>
<li><strong>Test fixtures</strong> and mock data</li>
<li><strong>API client wrappers</strong> with authentication baked in</li>
</ul>
<p>A deployment skill, for example, might include a Python script that validates the deployment target, runs pre-deployment checks, and rolls back on failure — all triggered automatically when the agent decides to deploy. A plain Markdown file can describe these steps, but it can&rsquo;t execute them.</p>
<h3 id="the-hermes-agent-example">The Hermes Agent Example</h3>
<p>Hermes Agent by Nous Research demonstrates this pattern in practice. Its skills system supports:</p>
<ul>
<li><strong>SKILL.md</strong> with YAML front-matter for metadata</li>
<li><strong>Linked files</strong> — references, templates, scripts — stored alongside the skill</li>
<li><strong>Cron job integration</strong> — skills can be loaded by scheduled tasks</li>
<li><strong>Cross-profile isolation</strong> — each Hermes profile has its own skills directory</li>
</ul>
<p>This is the direction the ecosystem is moving: skills as <strong>self-contained packages of agent capability</strong>, not just documentation.</p>
<h2 id="the-security-reality-check">The Security Reality Check</h2>
<p>If skills are just Markdown files, what&rsquo;s the security risk? The answer is: <strong>the same risk as any executable content delivery system</strong>.</p>
<p>The OpenClaw skills marketplace — the largest public registry of AI agent skills — was audited by RankClaw, which examined all 14,706 skills in the marketplace. The findings were alarming:</p>
<ul>
<li><strong>1,103 skills (7.5%) were malicious</strong></li>
<li>The <strong>#1 most downloaded skill</strong> on the marketplace was malware</li>
<li>Static analysis and AI-based auditing were insufficient to catch all runtime threats</li>
</ul>
<p>This is the &ldquo;npm for AI skills&rdquo; nightmare. When you create a marketplace where anyone can publish skills, you inherit all the security problems of package registries — supply chain attacks, typosquatting, malicious updates, and dependency confusion.</p>
<h3 id="the-security-landscape">The Security Landscape</h3>
<table>
  <thead>
      <tr>
          <th>Threat</th>
          <th>Description</th>
          <th>Real-World Example</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Malicious skills</td>
          <td>Skills designed to exfiltrate data or compromise the agent</td>
          <td>7.5% of OpenClaw skills</td>
      </tr>
      <tr>
          <td>Supply chain attacks</td>
          <td>Compromised skill dependencies</td>
          <td>#1 download was malware</td>
      </tr>
      <tr>
          <td>Typosquatting</td>
          <td>Skills named to mimic popular ones</td>
          <td>Common in npm ecosystem</td>
      </tr>
      <tr>
          <td>Privilege escalation</td>
          <td>Skills that request more tools than needed</td>
          <td>Front-matter tool restrictions</td>
      </tr>
      <tr>
          <td>Data exfiltration</td>
          <td>Skills that read and transmit sensitive data</td>
          <td>Runtime detection challenges</td>
      </tr>
  </tbody>
</table>
<p>The lesson is clear: <strong>skills need security scanning, sandboxing, and trust verification</strong> — the same infrastructure that package registries like npm, PyPI, and RubyGems have built over decades. The agent skill ecosystem is learning these lessons from scratch, and the early results are sobering.</p>
<h2 id="the-npm-for-skills-vision">The npm-for-Skills Vision</h2>
<p>Despite the security challenges, the vision of a community-driven skill registry is compelling. The parallels to npm are intentional:</p>
<ul>
<li><strong>npm</strong> made JavaScript package sharing trivial → <strong>Skill registries</strong> make agent capability sharing trivial</li>
<li><strong>npm</strong> created a massive ecosystem of reusable code → <strong>Skill registries</strong> create reusable agent behaviors</li>
<li><strong>npm</strong> struggled with security for years → <strong>Skill registries</strong> are learning those lessons now</li>
</ul>
<p>The Generalized approach — skills as versioned, evaluated, and trust-scored packages — represents the mature vision. Tessl&rsquo;s proposed framework for evaluating skills focuses on:</p>
<ol>
<li><strong>Structured metadata</strong> — version, author, dependencies, tool requirements</li>
<li><strong>Performance evaluation</strong> — how well does the skill actually work?</li>
<li><strong>Security scoring</strong> — automated and manual review processes</li>
<li><strong>Versioning</strong> — semantic versioning for skills, with changelogs and migration guides</li>
</ol>
<p>This is where the ecosystem is heading, but we&rsquo;re in the early days. The current state is closer to &ldquo;wild west&rdquo; than &ldquo;curated registry.&rdquo;</p>
<h2 id="what-the-skeptic-was-right-about">What the Skeptic Was Right About</h2>
<p>Let&rsquo;s give credit where it&rsquo;s due. The skeptic who asked &ldquo;why not just AGENTS.md?&rdquo; was right about several things:</p>
<ol>
<li>
<p><strong>Skills are fundamentally just organized Markdown.</strong> The core content of a skill is text instructions. There&rsquo;s no magic — no special AI sauce that makes skills work differently than reading a file.</p>
</li>
<li>
<p><strong>The abstraction adds complexity.</strong> Skills introduce a new concept — the skill directory, the enumerator, the loading mechanism — that a simple file structure doesn&rsquo;t need.</p>
</li>
<li>
<p><strong>For small projects, AGENTS.md works fine.</strong> If you have 3-5 instructions and a single domain, a monolithic file is simpler and equally effective.</p>
</li>
<li>
<p><strong>The skill ecosystem is immature.</strong> Security is poor, standards are still forming, and the tooling is rough around the edges.</p>
</li>
</ol>
<p>The skeptic&rsquo;s core insight — that skills are &ldquo;just organized docs with a loading mechanism&rdquo; — is essentially correct. The question is whether that loading mechanism matters enough to justify the abstraction.</p>
<h2 id="what-the-skeptic-was-missing">What the Skeptic Was Missing</h2>
<p>Here&rsquo;s what the skeptic&rsquo;s framing misses:</p>
<h3 id="1-scale-changes-everything">1. Scale Changes Everything</h3>
<p>A single <code>AGENTS.md</code> works for a personal project. It doesn&rsquo;t work for a team of 20 developers maintaining 50+ instruction sets across multiple domains. Skills are an <strong>organizational pattern</strong> that scales, not a technical trick.</p>
<h3 id="2-progressive-disclosure-is-not-just-lazy-loading">2. Progressive Disclosure Is Not Just &ldquo;Lazy Loading&rdquo;</h3>
<p>Calling skills &ldquo;lazy-loaded Markdown&rdquo; is technically accurate but misses the architectural significance. Progressive disclosure changes how the agent reasons:</p>
<ul>
<li><strong>Without skills:</strong> The agent has all instructions in context and must decide which to follow. This is like giving a chef every recipe in the cookbook and asking them to cook one dish.</li>
<li><strong>With skills:</strong> The agent sees a menu of capabilities and requests only what it needs. This is like the chef picking a recipe card from the box.</li>
</ul>
<p>The difference isn&rsquo;t in the content — it&rsquo;s in the <strong>decision architecture</strong>.</p>
<h3 id="3-composability-enables-emergent-behavior">3. Composability Enables Emergent Behavior</h3>
<p>When skills are modular and composable, agents can combine them in ways the author didn&rsquo;t anticipate. A testing skill + a deployment skill + a monitoring skill can produce a CI/CD pipeline that none of the individual skills described. This emergent composition is where the real value lives.</p>
<h3 id="4-security-boundaries-are-architectural">4. Security Boundaries Are Architectural</h3>
<p>The front-matter in a skill can declare what tools it needs. This enables sandboxing — a skill that only needs file-reading tools shouldn&rsquo;t have network access. A monolithic <code>AGENTS.md</code> can&rsquo;t enforce these boundaries because everything is in one blob.</p>
<h2 id="the-bottom-line">The Bottom Line</h2>
<p>Skills are a <strong>packaging convention</strong>, not magic. They take the same Markdown instructions you&rsquo;d put in an <code>AGENTS.md</code> and add:</p>
<ol>
<li><strong>Progressive disclosure</strong> — load only what&rsquo;s relevant, when it&rsquo;s relevant</li>
<li><strong>Composability</strong> — mix and match skills from different sources</li>
<li><strong>Versioning</strong> — track and update skills independently</li>
<li><strong>Security boundaries</strong> — declare and enforce tool requirements</li>
<li><strong>Portability</strong> — share skills across agent platforms</li>
</ol>
<p>The skeptic was right that skills are &ldquo;just organized docs with a loading mechanism.&rdquo; But that loading mechanism — progressive disclosure — is the difference between a library where every book is open on the table and a library where you browse the catalog and pull only the books you need.</p>
<p>For small projects, <code>AGENTS.md</code> is fine. For anything that scales — multiple domains, multiple developers, multiple agent platforms — skills are the difference between chaos and structure. And in a world where 7.5% of published skills are malicious, that structure might also be the difference between a secure agent and a compromised one.</p>
<h2 id="frequently-asked-questions">Frequently Asked Questions</h2>
<h3 id="do-i-need-skills-for-a-simple-personal-project">Do I need skills for a simple personal project?</h3>
<p>No. If you&rsquo;re the only developer and your agent handles 3-5 tasks, a single <code>AGENTS.md</code> or <code>CLAUDE.md</code> file is simpler and equally effective. Skills become valuable when you have multiple domains, multiple developers, or complex workflows.</p>
<h3 id="can-i-use-claude-code-skills-with-non-anthropic-agents">Can I use Claude Code skills with non-Anthropic agents?</h3>
<p>Yes. The Claude Code skills format (YAML front-matter + Markdown body) has become a de facto open standard. Codex CLI, Cursor, and Hermes Agent all support the same format with minimal adaptation.</p>
<h3 id="how-do-skills-affect-token-usage-and-cost">How do skills affect token usage and cost?</h3>
<p>Skills reduce token usage by keeping only relevant instructions in context. Instead of loading a 10,000-token instruction file on every interaction, the agent loads a 200-token index and fetches only the skills it needs. This can reduce context costs by 80-95% for complex projects.</p>
<h3 id="whats-the-biggest-risk-of-using-community-skills">What&rsquo;s the biggest risk of using community skills?</h3>
<p>Security. The OpenClaw marketplace audit found 7.5% of skills were malicious, and the #1 most downloaded skill was malware. Always audit community skills before using them, and prefer skills from trusted sources.</p>
<h3 id="can-skills-include-executable-code-or-are-they-just-text">Can skills include executable code, or are they just text?</h3>
<p>Modern skill systems support both. While the core format is Markdown, many implementations allow skills to bundle scripts, templates, and artifacts. Hermes Agent, for example, supports linked files including Python scripts that run when the skill is activated.</p>
]]></content:encoded></item></channel></rss>