<?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>Gemini on Lavi Nigam</title>
    <link>https://lavinigam.com/tags/gemini/</link>
    <description>Recent content in Gemini on Lavi Nigam</description>
    <generator>Hugo -- 0.152.2</generator>
    <language>en-us</language>
    <copyright>Lavi Nigam</copyright>
    <lastBuildDate>Tue, 10 Mar 2026 10:00:00 +0530</lastBuildDate>
    <atom:link href="https://lavinigam.com/tags/gemini/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>5 Agent Skill Design Patterns Every ADK Developer Should Know</title>
      <link>https://lavinigam.com/posts/adk-skill-design-patterns/</link>
      <pubDate>Sat, 07 Mar 2026 10:00:00 +0530</pubDate>
      <guid>https://lavinigam.com/posts/adk-skill-design-patterns/</guid>
      <description>Master 5 SKILL.md design patterns for Google ADK agents — Tool Wrapper, Generator, Reviewer, Inversion, Pipeline. Includes working code and a decision tree.</description>
      <content:encoded><![CDATA[
<blockquote>
  <p><strong>This post extends the 3-part ADK Skills series:</strong></p>
<ul>
<li><a href="/posts/adk-agent-skills-part1/"
>Part 1: Progressive Disclosure with SkillToolset</a>
</li>
<li><a href="/posts/adk-agent-skills-part2/"
>Part 2: File-Based, External Skills &amp; SkillToolset Internals</a>
</li>
<li><a href="/posts/adk-agent-skills-part3/"
>Part 3: Skills That Write Skills — Self-Extending ADK Agents</a>
</li>
<li><a href="https://google.github.io/adk-docs/tutorials/coding-with-ai/?utm_campaign=adk-skill-design-patterns&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>ADK Core Skills</a>
 — official skills for building ADK agents</li>
</ul>

</blockquote>
<p><strong>ADK skill design patterns</strong> are reusable structural templates for organizing SKILL.md files — the markdown-based instruction format that tells Google ADK agents how to use tools, generate content, or orchestrate multi-step workflows. In <a href="/posts/adk-agent-skills-part1/"
>Parts 1-3</a>
 of this series, I covered the foundations — what agent skills are, how Google ADK&rsquo;s <a href="https://google.github.io/adk-docs/skills/?utm_campaign=adk-skill-design-patterns&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>SkillToolset</a>
 implements progressive disclosure, and how to build self-extending agents with meta-skills. But one question kept coming up in my own projects: I know how to create a skill, but how should I structure the content inside it?</p>
<p>A skill that wraps FastAPI conventions looks nothing like a skill that runs a 4-step documentation pipeline, yet both use the same SKILL.md format. The <a href="https://agentskills.io/specification?utm_campaign=adk-skill-design-patterns&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>Agent Skills specification</a>
 defines the container — SKILL.md frontmatter, <code>references/</code>, <code>assets/</code>, <code>scripts/</code> directories — but says nothing about what goes inside. That&rsquo;s a content design problem, not a format problem.</p>
<p>Five patterns keep surfacing. I&rsquo;ve seen them across Claude Code&rsquo;s <a href="https://github.com/anthropics/skills" target="_blank" rel="noopener noreferrer"
>bundled skills</a>
, community repos on <a href="https://skills.sh/" target="_blank" rel="noopener noreferrer"
>skills.sh</a>
, real-world projects, and even in a <a href="https://arxiv.org/html/2602.20867v1" target="_blank" rel="noopener noreferrer"
>recent arXiv paper</a>
 that formally catalogued seven system-level skill design patterns. This post names the five most practical ones, shows each in ADK with working code, and helps you pick the right one for your use case.</p>
<p>By the end of this post, you&rsquo;ll know how to:</p>
<ul>
<li>Use a <strong>Tool Wrapper</strong> to make your agent an instant expert on any library or framework</li>
<li>Use a <strong>Generator</strong> to produce consistently structured documents from a reusable template</li>
<li>Use a <strong>Reviewer</strong> to have your agent score code against a checklist, grouped by severity</li>
<li>Use an <strong>Inversion</strong> to flip the conversation — the agent asks you questions before acting</li>
<li>Use a <strong>Pipeline</strong> to enforce a strict step-by-step workflow with checkpoints between stages</li>
</ul>




<a class="btn btn-primary" href="https://github.com/lavinigam-gcp/build-with-adk/tree/main/adk-skill-design-patterns" target="_blank" rel="noopener noreferrer">
  Clone the Repo &#x2197;
</a>


<blockquote class="alert alert-note">
  <p class="alert-heading">
    <span class="alert-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path d="M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"/></svg>
    </span> Note</p>
  <ul>
<li><strong>Tool Wrapper</strong> — like a cheat sheet for a library; makes your agent apply its conventions only when relevant</li>
<li><strong>Generator</strong> — like a form your agent fills in; produces consistently structured documents every time</li>
<li><strong>Reviewer</strong> — like a rubric; scores submitted code against a checklist with findings grouped by severity</li>
<li><strong>Inversion</strong> — the agent interviews you first; asks structured questions before producing any output</li>
<li><strong>Pipeline</strong> — like a recipe with sign-offs; enforces a strict step-by-step workflow so nothing gets skipped</li>
<li>All five patterns <strong>compose</strong> — a Pipeline can include a Reviewer step; a Generator can use Inversion for input gathering</li>
</ul>
</blockquote>
<h2 id="one-skillmd-format-many-use-cases" class="heading-anchor">One SKILL.md Format, Many Use Cases<a href="#one-skillmd-format-many-use-cases" class="anchor" aria-hidden="true" tabindex="-1">#</a></h2>
<p>The <a href="https://agentskills.io/specification?utm_campaign=adk-skill-design-patterns&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>Agent Skills standard</a>
 has been adopted by over <a href="https://agentskills.io/home?utm_campaign=adk-skill-design-patterns&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>30 agent tools</a>
 — Claude Code, Gemini CLI, GitHub Copilot, Cursor, JetBrains Junie, and many more. Every skill follows the same directory layout:</p>
<pre tabindex="0"><code>skill-name/
├── SKILL.md          ← YAML frontmatter + markdown instructions (required)
├── references/       ← style guides, checklists, conventions (optional)
├── assets/           ← templates and output formats (optional)
└── scripts/          ← executable scripts (optional)
</code></pre><p>I covered the format in detail in <a href="/posts/adk-agent-skills-part2/"
>Part 2</a>
, so I won&rsquo;t repeat it here.</p>
<p>The format tells you how to package a skill. It doesn&rsquo;t tell you how to design the content. Should the instructions be a checklist? A workflow? A set of questions? Should references hold style guides, templates, or lookup tables? The answer depends on what your skill is trying to do, and that&rsquo;s where patterns come in.</p>
<p>Each of the five patterns in this post uses the same SKILL.md format but structures the content differently — different instruction styles, different resource types, different relationships between L2 (instructions) and L3 (references/assets). If you need a refresher on the three progressive disclosure levels, see <a href="/posts/adk-agent-skills-part1/#what-are-skills-and-why-they-matter"
>Part 1&rsquo;s explanation</a>
.</p>
<h2 id="quick-recap-skilltoolset-and-the-three-levels" class="heading-anchor">Quick Recap: SkillToolset and the Three Levels<a href="#quick-recap-skilltoolset-and-the-three-levels" class="anchor" aria-hidden="true" tabindex="-1">#</a></h2>
<p>ADK&rsquo;s <a href="https://google.github.io/adk-docs/skills/?utm_campaign=adk-skill-design-patterns&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
><code>SkillToolset</code></a>
 implements progressive disclosure through three auto-generated tools. I covered the internals in <a href="/posts/adk-agent-skills-part2/#wiring-adk-skills-with-skilltoolset"
>Part 2</a>
, so here&rsquo;s just the quick version: <code>list_skills</code> shows skill names and descriptions (L1), <code>load_skill</code> fetches full instructions (L2), and <a href="https://google.github.io/adk-docs/skills/#define-skills-with-files?utm_campaign=adk-skill-design-patterns&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
><code>load_skill_resource</code></a>
 loads reference files and templates on demand (L3). The agent pays ~100 tokens per skill at startup, then loads the rest only when needed.</p>
<p>For the pattern examples in this post, all five skills are loaded into a single <code>SkillToolset</code>. The agent decides which to activate based on the user&rsquo;s request.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># agent.py</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">pathlib</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">google.adk</span> <span class="kn">import</span> <span class="n">Agent</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">google.adk.skills</span> <span class="kn">import</span> <span class="n">load_skill_from_dir</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">google.adk.tools.skill_toolset</span> <span class="kn">import</span> <span class="n">SkillToolset</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">SKILLS_DIR</span> <span class="o">=</span> <span class="n">pathlib</span><span class="o">.</span><span class="n">Path</span><span class="p">(</span><span class="vm">__file__</span><span class="p">)</span><span class="o">.</span><span class="n">parent</span> <span class="o">/</span> <span class="s2">&#34;skills&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">skill_toolset</span> <span class="o">=</span> <span class="n">SkillToolset</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="n">skills</span><span class="o">=</span><span class="p">[</span>
</span></span><span class="line"><span class="cl">        <span class="n">load_skill_from_dir</span><span class="p">(</span><span class="n">SKILLS_DIR</span> <span class="o">/</span> <span class="s2">&#34;api-expert&#34;</span><span class="p">),</span>       <span class="c1"># Pattern 1: Tool Wrapper</span>
</span></span><span class="line"><span class="cl">        <span class="n">load_skill_from_dir</span><span class="p">(</span><span class="n">SKILLS_DIR</span> <span class="o">/</span> <span class="s2">&#34;report-generator&#34;</span><span class="p">),</span> <span class="c1"># Pattern 2: Generator</span>
</span></span><span class="line"><span class="cl">        <span class="n">load_skill_from_dir</span><span class="p">(</span><span class="n">SKILLS_DIR</span> <span class="o">/</span> <span class="s2">&#34;code-reviewer&#34;</span><span class="p">),</span>    <span class="c1"># Pattern 3: Reviewer</span>
</span></span><span class="line"><span class="cl">        <span class="n">load_skill_from_dir</span><span class="p">(</span><span class="n">SKILLS_DIR</span> <span class="o">/</span> <span class="s2">&#34;project-planner&#34;</span><span class="p">),</span>  <span class="c1"># Pattern 4: Inversion</span>
</span></span><span class="line"><span class="cl">        <span class="n">load_skill_from_dir</span><span class="p">(</span><span class="n">SKILLS_DIR</span> <span class="o">/</span> <span class="s2">&#34;doc-pipeline&#34;</span><span class="p">),</span>     <span class="c1"># Pattern 5: Pipeline</span>
</span></span><span class="line"><span class="cl">    <span class="p">],</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">root_agent</span> <span class="o">=</span> <span class="n">Agent</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="n">model</span><span class="o">=</span><span class="s2">&#34;gemini-2.5-flash&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">name</span><span class="o">=</span><span class="s2">&#34;pattern_demo_agent&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">instruction</span><span class="o">=</span><span class="s2">&#34;Load relevant skills before acting on any user request.&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">tools</span><span class="o">=</span><span class="p">[</span><span class="n">skill_toolset</span><span class="p">],</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span></code></pre></div><p>The description field in each skill&rsquo;s frontmatter is the most important line. It&rsquo;s the agent&rsquo;s search index — if the description is vague, the agent won&rsquo;t activate the skill when it should. Each pattern below shows how to write descriptions that trigger reliably.</p>
<h2 id="pattern-1-tool-wrapper--teach-the-agent-a-library" class="heading-anchor">Pattern 1: Tool Wrapper — Teach the Agent a Library<a href="#pattern-1-tool-wrapper--teach-the-agent-a-library" class="anchor" aria-hidden="true" tabindex="-1">#</a></h2>
<p>A <strong>Tool Wrapper</strong> is an agent skill that packages a library or tool&rsquo;s conventions, best practices, and coding standards into on-demand knowledge the agent loads when working with that technology. It is the simplest SKILL.md pattern — instructions plus reference files, no templates or scripts.</p>
<p>A Tool Wrapper skill packages a library or tool&rsquo;s conventions into on-demand knowledge. The agent becomes a domain expert when the skill is loaded. Think FastAPI conventions, Terraform patterns, security policies, or database query best practices.</p>
<p>This is the simplest pattern. No templates, no scripts — just instructions telling the agent what rules to follow, plus <code>references/</code> holding the detailed convention docs.</p>
<p><figure>
  <img src="pattern-tool-wrapper.webp" alt="Pattern 1: Tool Wrapper — SKILL.md loads references with library conventions, agent applies rules" loading="lazy" />
</figure>

<em>The Tool Wrapper pattern: SKILL.md triggers on library keywords, loads conventions from references/, and the agent applies them as domain expertise.</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># skills/api-expert/SKILL.md</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nn">---</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">api-expert</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">description</span><span class="p">:</span><span class="w"> </span><span class="l">FastAPI development best practices and conventions. Use when building, reviewing, or debugging FastAPI applications, REST APIs, or Pydantic models.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">pattern</span><span class="p">:</span><span class="w"> </span><span class="l">tool-wrapper</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">domain</span><span class="p">:</span><span class="w"> </span><span class="l">fastapi</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nn">---</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="l">You are an expert in FastAPI development. Apply these conventions to the user&#39;s code or question.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c">## Core Conventions</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="l">Load &#39;references/conventions.md&#39; for the complete list of FastAPI best practices.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c">## When Reviewing Code</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="m">1</span><span class="l">. Load the conventions reference</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="m">2</span><span class="l">. Check the user&#39;s code against each convention</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="m">3</span><span class="l">. For each violation, cite the specific rule and suggest the fix</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c">## When Writing Code</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="m">1</span><span class="l">. Load the conventions reference</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="m">2</span><span class="l">. Follow every convention exactly</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="m">3</span><span class="l">. Add type annotations to all function signatures</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="m">4</span><span class="l">. Use Annotated style for dependency injection</span><span class="w">
</span></span></span></code></pre></div><p>The <code>references/conventions.md</code> file holds the actual rules — naming conventions, route definitions, error handling patterns, async vs sync guidance. The agent loads this file only when it activates the skill, keeping the baseline context small.</p>
<p>The <code>description</code> here is critical. It includes specific keywords — &ldquo;FastAPI&rdquo;, &ldquo;REST APIs&rdquo;, &ldquo;Pydantic models&rdquo; — that match what developers actually type. A description like &ldquo;Helps with APIs&rdquo; would rarely trigger because it&rsquo;s too generic.</p>
<h3 id="when-to-use-tool-wrapper" class="heading-anchor">When to use Tool Wrapper<a href="#when-to-use-tool-wrapper" class="anchor" aria-hidden="true" tabindex="-1">#</a></h3>
<p>When you want your agent to apply consistent, expert-level conventions for a specific library, SDK, or internal system. This is the most widely adopted pattern — several engineering teams have open-sourced theirs as reference:</p>
<ul>
<li><strong>Vercel <a href="https://github.com/vercel-labs/agent-skills" target="_blank" rel="noopener noreferrer"
><code>react-best-practices</code></a>
</strong> — 40+ React and Next.js performance rules from Vercel Engineering, organized by impact level (CRITICAL → LOW), loaded on demand when the agent works on React or Next.js code</li>
<li><strong>Supabase <a href="https://github.com/supabase/agent-skills" target="_blank" rel="noopener noreferrer"
><code>supabase-postgres-best-practices</code></a>
</strong> — Postgres optimization guidelines across 8 categories (query performance, connection management, RLS, security) structured as on-demand references</li>
<li><strong>Google <a href="https://github.com/google-gemini/gemini-skills" target="_blank" rel="noopener noreferrer"
><code>gemini-api-dev</code></a>
</strong> — Google&rsquo;s official Tool Wrapper for the Gemini API, encoding best practices for building Gemini-powered apps, installable directly into any skills-compatible agent</li>
<li><strong>Google <a href="https://github.com/google/adk-docs/tree/main/skills?utm_campaign=adk-skill-design-patterns&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
><code>adk-core-skills</code></a>
</strong> — Google&rsquo;s official ADK development skills: 6 skills covering the ADK developer guide, cheatsheet, evaluation, deployment, observability, and scaffolding. Installable via <code>npx skills add google/adk-docs -y -g</code> into any coding agent (Gemini CLI, Claude Code, Cursor). These are Tool Wrappers that teach coding agents how to write ADK code correctly — the ADK team dogfooding the same SKILL.md format that <code>SkillToolset</code> uses at runtime.</li>
</ul>
<p>The pattern works equally well for internal tools: write a <code>google-adk-conventions</code> skill that encodes your team&rsquo;s ADK patterns — which model to default to, how to name agents, how to wire toolsets, how to handle errors — and every ADK agent your team builds follows the same conventions automatically, without repeating them in every system prompt.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># skills/google-adk-conventions/SKILL.md</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nn">---</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">google-adk-conventions</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">description</span><span class="p">:</span><span class="w"> </span><span class="l">Google ADK coding conventions and best practices. Use when building,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="l">reviewing, or debugging any ADK agent, tool, or multi-agent system.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">pattern</span><span class="p">:</span><span class="w"> </span><span class="l">tool-wrapper</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">domain</span><span class="p">:</span><span class="w"> </span><span class="l">google-adk</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nn">---</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="l">You are an ADK expert. Apply these conventions when writing or reviewing ADK code.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c">## Agent Naming</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="l">The `name` field must match the agent&#39;s directory name exactly (`search-agent/` → `name=&#34;search-agent&#34;`)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="nt">Use lowercase, hyphen-separated names</span><span class="p">:</span><span class="w"> </span><span class="l">`search-agent`, not `SearchAgent`</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c">## Model Selection</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="l">Default to `gemini-2.5-flash` for most tasks (fast, cost-efficient)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="l">Use `gemini-2.5-pro` only for complex multi-step reasoning</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="nt">Define model as a constant, never hardcode inline</span><span class="p">:</span><span class="w"> </span><span class="l">`MODEL = &#34;gemini-2.5-flash&#34;`</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c">## Tool Definitions</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">Load `references/tool-conventions.md` for the complete rules. Key points</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="nt">Names</span><span class="p">:</span><span class="w"> </span><span class="l">verb-noun, snake_case — `get_weather`, `search_documents`, not `run` or `doStuff`</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="nt">Always add type hints: `city: str`, `user_id</span><span class="p">:</span><span class="w"> </span><span class="l">int`</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="kc">No</span><span class="w"> </span><span class="l">default parameter values — the LLM must derive or request all inputs</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="l">Docstring is the LLM&#39;s primary manual — be precise, don&#39;t describe `ToolContext`</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c">## Multi-Agent Systems</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="l">The `description` field on sub-agents is your routing API — be specific, not generic</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="l">Only one built-in tool (Google Search, Code Exec) per root agent</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="l">Group related tools into a `BaseToolset` subclass when an agent has 5+ tools</span><span class="w">
</span></span></span></code></pre></div>
<blockquote class="alert alert-note">
  <p class="alert-heading">
    <span class="alert-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path d="M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"/></svg>
    </span> Note</p>
  <p>The <code>metadata</code> field in frontmatter is a <code>dict[str, str]</code> — ADK stores it but doesn&rsquo;t enforce any schema. I use it to tag skills by pattern and domain, which helps when you have 20+ skills and need to audit them.</p>
</blockquote>
<h2 id="pattern-2-generator--produce-structured-output" class="heading-anchor">Pattern 2: Generator — Produce Structured Output<a href="#pattern-2-generator--produce-structured-output" class="anchor" aria-hidden="true" tabindex="-1">#</a></h2>
<p>A <strong>Generator</strong> skill produces documents, reports, or configurations by filling a reusable template. Unlike Tool Wrapper, it uses both optional directories: <code>assets/</code> holds the output template (the structure to fill in), and <code>references/</code> holds the style guide (the quality rules to follow). The instructions orchestrate the process — load the style guide, load the template, gather inputs, fill it in.</p>
<p><figure>
  <img src="pattern-generator.webp" alt="Pattern 2: Generator — SKILL.md orchestrates template filling with style guide rules" loading="lazy" />
</figure>

<em>The Generator pattern: instructions orchestrate the process, references/ defines quality rules, assets/ provides the output template.</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># skills/report-generator/SKILL.md</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nn">---</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">report-generator</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">description</span><span class="p">:</span><span class="w"> </span><span class="l">Generates structured technical reports in Markdown. Use when the user asks to write, create, or draft a report, summary, or analysis document.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">pattern</span><span class="p">:</span><span class="w"> </span><span class="l">generator</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">output-format</span><span class="p">:</span><span class="w"> </span><span class="l">markdown</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nn">---</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">You are a technical report generator. Follow these steps exactly</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">Step 1</span><span class="p">:</span><span class="w"> </span><span class="l">Load &#39;references/style-guide.md&#39; for tone and formatting rules.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">Step 2</span><span class="p">:</span><span class="w"> </span><span class="l">Load &#39;assets/report-template.md&#39; for the required output structure.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">Step 3</span><span class="p">:</span><span class="w"> </span><span class="nt">Ask the user for any missing information needed to fill the template</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="l">Topic or subject</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="l">Key findings or data points</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="l">Target audience (technical, executive, general)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">Step 4</span><span class="p">:</span><span class="w"> </span><span class="l">Fill the template following the style guide rules. Every section in the template must be present in the output.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">Step 5</span><span class="p">:</span><span class="w"> </span><span class="l">Return the completed report as a single Markdown document.</span><span class="w">
</span></span></span></code></pre></div><p>The template in <code>assets/report-template.md</code> defines the exact sections every report must have — Executive Summary, Background, Methodology, Findings, Summary Table, Recommendations, Next Steps. The style guide in <code>references/style-guide.md</code> controls tone (&ldquo;third person, active voice&rdquo;), formatting (&ldquo;H2 for sections, H3 for subsections&rdquo;), and quality (&ldquo;Executive Summary under 150 words, no vague Next Steps&rdquo;).</p>
<p>The agent loads both files via <code>load_skill_resource</code> when it activates the skill. The template enforces structure, the style guide enforces quality. Swap either file to change the output without touching the instructions.</p>
<h3 id="when-to-use-generator" class="heading-anchor">When to use Generator<a href="#when-to-use-generator" class="anchor" aria-hidden="true" tabindex="-1">#</a></h3>
<p>When the output needs to follow a fixed structure every time — consistency matters more than creativity. Common real-world uses:</p>
<ul>
<li><strong>Technical reports</strong> — Executive Summary, Methodology, Findings, Recommendations, always in the same order regardless of topic</li>
<li><strong>API documentation</strong> — every endpoint documented with the same sections: description, parameters, request/response examples, error codes</li>
<li><strong>Commit messages</strong> — enforce Conventional Commits format (<code>feat:</code>, <code>fix:</code>, <code>docs:</code>) from a template, so every commit in the repo reads consistently</li>
<li><strong>ADK agent scaffolding</strong> — generate the standard <code>agent.py</code> + <code>__init__.py</code> + <code>.env</code> structure for a new ADK project from a template, pre-wired with your team&rsquo;s model constant and instruction style</li>
</ul>
<h2 id="pattern-3-reviewer--evaluate-against-a-standard" class="heading-anchor">Pattern 3: Reviewer — Evaluate Against a Standard<a href="#pattern-3-reviewer--evaluate-against-a-standard" class="anchor" aria-hidden="true" tabindex="-1">#</a></h2>
<p>A <strong>Reviewer</strong> skill evaluates code, content, or artifacts against a checklist stored in <code>references/</code>, producing a scored findings report grouped by severity. The key design insight: separating WHAT to check (the checklist file) from HOW to check (the review protocol in the instructions). Swap <code>references/review-checklist.md</code> for <code>references/security-checklist.md</code> and you get a completely different review from the same skill structure.</p>
<p><figure>
  <img src="pattern-reviewer.webp" alt="Pattern 3: Reviewer — input flows through review protocol, checklist drives evaluation, produces scored report" loading="lazy" />
</figure>

<em>The Reviewer pattern: user submits code, the skill loads its checklist from references/, applies the review protocol, and produces a findings report grouped by severity.</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># skills/code-reviewer/SKILL.md</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nn">---</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">code-reviewer</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">description</span><span class="p">:</span><span class="w"> </span><span class="l">Reviews Python code for quality, style, and common bugs. Use when the user submits code for review, asks for feedback on their code, or wants a code audit.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">pattern</span><span class="p">:</span><span class="w"> </span><span class="l">reviewer</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">severity-levels</span><span class="p">:</span><span class="w"> </span><span class="l">error,warning,info</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nn">---</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">You are a Python code reviewer. Follow this review protocol exactly</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">Step 1</span><span class="p">:</span><span class="w"> </span><span class="l">Load &#39;references/review-checklist.md&#39; for the complete review criteria.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">Step 2</span><span class="p">:</span><span class="w"> </span><span class="l">Read the user&#39;s code carefully. Understand its purpose before critiquing.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">Step 3</span><span class="p">:</span><span class="w"> </span><span class="nt">Apply each rule from the checklist to the code. For every violation found</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="l">Note the line number (or approximate location)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="nt">Classify severity</span><span class="p">:</span><span class="w"> </span><span class="l">error (must fix), warning (should fix), info (consider)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="l">Explain WHY it&#39;s a problem, not just WHAT is wrong</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="l">Suggest a specific fix with corrected code</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">Step 4</span><span class="p">:</span><span class="w"> </span><span class="nt">Produce a structured review with these sections</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="cp">**Summary**:</span><span class="w"> </span><span class="l">What the code does, overall quality assessment</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="cp">**Findings**:</span><span class="w"> </span><span class="l">Grouped by severity (errors first, then warnings, then info)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="cp">**Score**:</span><span class="w"> </span><span class="l">Rate 1-10 with brief justification</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="cp">**Top</span><span class="w"> </span><span class="nt">3 Recommendations**</span><span class="p">:</span><span class="w"> </span><span class="l">The most impactful improvements</span><span class="w">
</span></span></span></code></pre></div><p>The <code>references/review-checklist.md</code> contains the actual rules organized by category — Correctness (severity: error), Style (severity: warning), Documentation (severity: info), Security (severity: error), Performance (severity: info). Each category has specific, checkable items: &ldquo;No mutable default arguments&rdquo;, &ldquo;Functions under 30 lines&rdquo;, &ldquo;No wildcard imports.&rdquo;</p>
<p>When I tested this against a function with three intentional bugs — <code>PascalCase</code> naming, a mutable default argument, and a bare <code>except:</code> — the agent loaded the skill, fetched the checklist, and caught all three. It classified the mutable default as an error (correct — it&rsquo;s a bug), the naming as a warning (correct — it&rsquo;s style), and produced a scored report. The checklist drove the behavior, not the agent&rsquo;s pre-training.</p>
<h3 id="when-to-use-reviewer" class="heading-anchor">When to use Reviewer<a href="#when-to-use-reviewer" class="anchor" aria-hidden="true" tabindex="-1">#</a></h3>
<p>Anywhere a human reviewer works from a checklist — a Reviewer skill can encode it and apply it consistently. Common real-world uses:</p>
<ul>
<li><strong>Code review</strong> — catch mutable defaults, missing type hints, bare <code>except:</code> blocks against your team&rsquo;s style rules; <a href="https://medium.com/google-cloud/i-built-an-agent-skill-for-googles-adk-here-s-why-your-coding-agent-needs-one-too-e5d3a56ef81b" target="_blank" rel="noopener noreferrer"
>Giorgio Crivellari</a>
 demonstrated this with an ADK governance skill that lifted code quality scores from 29% to 99%</li>
<li><strong>Security audit</strong> — run OWASP Top 10 checks against submitted code, classifying findings by severity before any human review</li>
<li><strong>Editorial review</strong> — check blog posts or docs against a house style guide (tone, heading structure, word count, forbidden phrases)</li>
<li><strong>ADK agent review</strong> — validate a new agent against your team&rsquo;s <code>google-adk-conventions</code>: naming, model constant, tool docstrings, description field quality</li>
</ul>
<h2 id="pattern-4-inversion--the-skill-interviews-you" class="heading-anchor">Pattern 4: Inversion — The Skill Interviews You<a href="#pattern-4-inversion--the-skill-interviews-you" class="anchor" aria-hidden="true" tabindex="-1">#</a></h2>
<p><strong>Inversion</strong> flips the typical agent interaction: instead of the user driving the conversation, the skill instructs the agent to ask structured questions through defined phases before producing any output. The agent won&rsquo;t act until it has gathered all the information it needs. No special framework support required — Inversion is purely an instruction-authoring pattern, relying on explicit gates like <code>DO NOT start building until all phases are complete</code> to hold the agent back.</p>
<p><figure>
  <img src="pattern-inversion.webp" alt="Pattern 4: Inversion — three phases of questions before synthesis" loading="lazy" />
</figure>

<em>The Inversion pattern: the skill drives the conversation through phased questions, only synthesizing output after all answers are gathered.</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># skills/project-planner/SKILL.md</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nn">---</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">project-planner</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">description</span><span class="p">:</span><span class="w"> </span><span class="l">Plans a new software project by gathering requirements through structured questions before producing a plan. Use when the user says &#34;I want to build&#34;, &#34;help me plan&#34;, &#34;design a system&#34;, or &#34;start a new project&#34;.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">pattern</span><span class="p">:</span><span class="w"> </span><span class="l">inversion</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">interaction</span><span class="p">:</span><span class="w"> </span><span class="l">multi-turn</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nn">---</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="l">You are conducting a structured requirements interview. DO NOT start building or designing until all phases are complete.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c">## Phase 1 — Problem Discovery (ask one question at a time, wait for each answer)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="l">Ask these questions in order. Do not skip any.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="nt">Q1</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;What problem does this project solve for its users?&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="nt">Q2</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;Who are the primary users? What is their technical level?&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="nt">Q3</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;What is the expected scale? (users per day, data volume, request rate)&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c">## Phase 2 — Technical Constraints (only after Phase 1 is fully answered)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="nt">Q4</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;What deployment environment will you use?&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="nt">Q5</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;Do you have any technology stack requirements or preferences?&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="nt">Q6</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;What are the non-negotiable requirements? (latency, uptime, compliance, budget)&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c">## Phase 3 — Synthesis (only after all questions are answered)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="m">1</span><span class="l">. Load &#39;assets/plan-template.md&#39; for the output format</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="m">2</span><span class="l">. Fill in every section of the template using the gathered requirements</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="m">3</span><span class="l">. Present the completed plan to the user</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">4. Ask</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;Does this plan accurately capture your requirements? What would you change?&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="m">5</span><span class="l">. Iterate on feedback until the user confirms</span><span class="w">
</span></span></span></code></pre></div><p>The phased structure is what makes Inversion work. Phase 1 must complete before Phase 2 starts. Phase 3 only triggers after all questions are answered. The <code>DO NOT start building or designing until all phases are complete</code> instruction at the top is the critical gate — without it, agents tend to jump to conclusions after the first answer.</p>
<p>The <code>assets/plan-template.md</code> anchors the synthesis step. It defines sections for Problem Statement, Target Users, Scale Requirements, Technical Architecture, Non-Negotiable Requirements, Proposed Milestones, Risks &amp; Mitigations, and Decision Log. The agent fills this template using the interview answers, producing a consistent output regardless of how the conversation went.</p>
<h3 id="when-to-use-inversion" class="heading-anchor">When to use Inversion<a href="#when-to-use-inversion" class="anchor" aria-hidden="true" tabindex="-1">#</a></h3>
<p>Anywhere the agent needs context from the user before it can do useful work — it prevents the most common agent failure mode: generating a detailed plan based on assumptions instead of asking. Common real-world uses:</p>
<ul>
<li><strong>Requirements gathering</strong> — interview a user about a project before producing a technical design, ensuring the plan reflects actual constraints rather than guesses</li>
<li><strong>Diagnostic interviews</strong> — walk through a structured troubleshooting checklist (environment, version, error message, reproduction steps) before suggesting a fix</li>
<li><strong>Configuration wizards</strong> — gather deployment preferences (cloud provider, region, scaling requirements) before generating infrastructure config</li>
<li><strong>ADK agent design</strong> — before scaffolding a new ADK agent, interview the user: what tools does it need, which model, is it part of a multi-agent system, what are the routing constraints?</li>
</ul>
<h2 id="pattern-5-pipeline--enforce-a-multi-step-workflow" class="heading-anchor">Pattern 5: Pipeline — Enforce a Multi-Step Workflow<a href="#pattern-5-pipeline--enforce-a-multi-step-workflow" class="anchor" aria-hidden="true" tabindex="-1">#</a></h2>
<p>A <strong>Pipeline</strong> skill defines a sequential workflow where each step must complete before the next begins, with explicit gate conditions that prevent the agent from skipping validation. It&rsquo;s the most complex pattern — unlike Tool Wrapper which just loads references, Pipeline uses all three optional directories (<code>references/</code>, <code>assets/</code>, <code>scripts/</code>) and adds control flow between steps. The instructions themselves are the workflow definition.</p>
<p><figure>
  <img src="pattern-pipeline.webp" alt="Pattern 5: Pipeline — four steps with gate conditions between them" loading="lazy" />
</figure>

<em>The Pipeline pattern: steps execute sequentially with diamond gate conditions. &ldquo;User confirms?&rdquo; gates prevent the agent from skipping validation.</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># skills/doc-pipeline/SKILL.md</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nn">---</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">doc-pipeline</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">description</span><span class="p">:</span><span class="w"> </span><span class="l">Generates API documentation from Python source code through a multi-step pipeline. Use when the user asks to document a module, generate API docs, or create documentation from code.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">pattern</span><span class="p">:</span><span class="w"> </span><span class="l">pipeline</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">steps</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;4&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nn">---</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="l">You are running a documentation generation pipeline. Execute each step in order. Do NOT skip steps or proceed if a step fails.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c">## Step 1 — Parse &amp; Inventory</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">Analyze the user&#39;s Python code to extract all public classes, functions, and constants. Present the inventory as a checklist. Ask</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;Is this the complete public API you want documented?&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c">## Step 2 — Generate Docstrings</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">For each function lacking a docstring</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="l">Load &#39;references/docstring-style.md&#39; for the required format</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="l">Generate a docstring following the style guide exactly</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="l">Present each generated docstring for user approval</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="l">Do NOT proceed to Step 3 until the user confirms.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c">## Step 3 — Assemble Documentation</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="l">Load &#39;assets/api-doc-template.md&#39; for the output structure. Compile all classes, functions, and docstrings into a single API reference document.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c">## Step 4 — Quality Check</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">Review against &#39;references/quality-checklist.md&#39;</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="l">Every public symbol documented</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="l">Every parameter has a type and description</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="l">At least one usage example per function</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="l">Report results. Fix issues before presenting the final document.</span><span class="w">
</span></span></span></code></pre></div><p>The gate conditions are the defining feature. &ldquo;Do NOT proceed to Step 3 until the user confirms&rdquo; prevents the agent from assembling documentation with unreviewed docstrings. &ldquo;Do NOT skip steps or proceed if a step fails&rdquo; at the top enforces the sequential constraint. Without these gates, agents tend to barrel through all steps and present a final result that skipped validation.</p>
<p>Each step loads different resources. Step 2 loads <code>references/docstring-style.md</code> (Google-style docstring format). Step 3 loads <code>assets/api-doc-template.md</code> (the output structure with Table of Contents, Classes, Functions, Constants sections). Step 4 loads <code>references/quality-checklist.md</code> (completeness and quality rules). The agent only pays context tokens for the resources it needs at each step.</p>
<h3 id="when-to-use-pipeline" class="heading-anchor">When to use Pipeline<a href="#when-to-use-pipeline" class="anchor" aria-hidden="true" tabindex="-1">#</a></h3>
<p>Any multi-step process where steps have dependencies and order matters — if skipping a step would produce incorrect or unvalidated output, use Pipeline. Common real-world uses:</p>
<ul>
<li><strong>Documentation generation</strong> — parse code → generate docstrings (with user approval) → assemble docs → quality check, with gates between each stage</li>
<li><strong>Data processing</strong> — validate input → transform → enrich → write output, where each step must succeed before the next runs</li>
<li><strong>Deployment workflows</strong> — run tests → build artifact → deploy to staging → smoke test → promote to production, with human confirmation gates</li>
<li><strong>ADK agent onboarding</strong> — interview user (Inversion) → scaffold files (Generator) → validate against conventions (Reviewer), composing three patterns into one Pipeline</li>
</ul>
<h2 id="choosing-the-right-adk-skill-pattern" class="heading-anchor">Choosing the Right ADK Skill Pattern<a href="#choosing-the-right-adk-skill-pattern" class="anchor" aria-hidden="true" tabindex="-1">#</a></h2>
<p>Each pattern answers a different question. Use this table to find the right one, then follow the decision tree below if you&rsquo;re still unsure.</p>
<table>
  <thead>
      <tr>
          <th>Pattern</th>
          <th>Use when…</th>
          <th>Directories used</th>
          <th>Complexity</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>Tool Wrapper</strong></td>
          <td>Agent needs expert knowledge about a specific library or tool</td>
          <td><code>references/</code></td>
          <td>Low</td>
      </tr>
      <tr>
          <td><strong>Generator</strong></td>
          <td>Output must follow a fixed template every time</td>
          <td><code>assets/</code> + <code>references/</code></td>
          <td>Medium</td>
      </tr>
      <tr>
          <td><strong>Reviewer</strong></td>
          <td>Code or content needs evaluation against a checklist</td>
          <td><code>references/</code></td>
          <td>Medium</td>
      </tr>
      <tr>
          <td><strong>Inversion</strong></td>
          <td>Agent must gather context from the user before acting</td>
          <td><code>assets/</code></td>
          <td>Medium — multi-turn</td>
      </tr>
      <tr>
          <td><strong>Pipeline</strong></td>
          <td>Workflow has ordered steps with validation gates between them</td>
          <td><code>references/</code> + <code>assets/</code> + <code>scripts/</code></td>
          <td>High</td>
      </tr>
  </tbody>
</table>
<p>Patterns compose. A Pipeline can include a Reviewer step — the doc-pipeline&rsquo;s Step 4 loads <code>quality-checklist.md</code> and evaluates the assembled document against it, which is the Reviewer pattern embedded inside a Pipeline. A Generator can use Inversion to gather inputs before producing output. A Tool Wrapper can be embedded as a reference file inside a Pipeline skill. The <a href="https://arxiv.org/html/2602.20867v1" target="_blank" rel="noopener noreferrer"
>arXiv paper &ldquo;SoK: Agentic Skills&rdquo;</a>
 (February 2026) found that production systems typically combine 2-3 patterns, with the most common combination being metadata-driven disclosure (our Tool Wrapper) plus marketplace distribution.</p>
<p>If you&rsquo;re unsure which pattern fits, start with this decision tree:</p>
<p><figure>
  <img src="pattern-comparison.webp" alt="Choosing the right pattern — decision tree flowchart with yes/no branches leading to each pattern" loading="lazy" />
</figure>

<em>Decision guide: follow the yes/no branches to find the right pattern for your use case. Most skills map clearly to one pattern.</em></p>
<h2 id="the-adk-skills-ecosystem" class="heading-anchor">The ADK Skills Ecosystem<a href="#the-adk-skills-ecosystem" class="anchor" aria-hidden="true" tabindex="-1">#</a></h2>
<p>You don&rsquo;t have to write every skill from scratch. The <a href="https://agentskills.io/specification?utm_campaign=adk-skill-design-patterns&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>Agent Skills standard</a>
 means any skill authored for Claude Code, Gemini CLI, Cursor, or <a href="https://agentskills.io/home?utm_campaign=adk-skill-design-patterns&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>30+ compatible agents</a>
 loads in ADK with <code>load_skill_from_dir()</code>. Here&rsquo;s where to find them:</p>
<ul>
<li><strong><a href="https://skills.sh/" target="_blank" rel="noopener noreferrer"
>skills.sh</a>
</strong> — the largest community marketplace (86,000+ installs); browse and install any skill with <code>npx skills add &lt;owner/repo&gt;</code></li>
<li><strong><a href="https://github.com/google-gemini/gemini-skills" target="_blank" rel="noopener noreferrer"
>google-gemini/gemini-skills</a>
</strong> — Google&rsquo;s official Tool Wrapper skills for the Gemini API, covering best practices for building Gemini-powered apps</li>
<li><strong><a href="https://github.com/google/adk-docs/tree/main/skills?utm_campaign=adk-skill-design-patterns&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>google/adk-docs/skills</a>
</strong> — Google&rsquo;s official ADK development skills (dev guide, cheatsheet, eval, deploy, observability, scaffold) — install via <code>npx skills add google/adk-docs -y -g</code></li>
<li><strong><a href="https://github.com/vercel-labs/agent-skills" target="_blank" rel="noopener noreferrer"
>vercel-labs/agent-skills</a>
</strong> — Vercel&rsquo;s official skills for React, Next.js, AI SDK, and deployment patterns (22K stars)</li>
<li><strong><a href="https://github.com/supabase/agent-skills" target="_blank" rel="noopener noreferrer"
>supabase/agent-skills</a>
</strong> — Supabase&rsquo;s Postgres optimization guidelines across query performance, RLS, and connection management</li>
<li><strong><a href="https://github.com/anthropics/skills" target="_blank" rel="noopener noreferrer"
>anthropics/skills</a>
</strong> — production-grade document skills for PowerPoint, Excel, Word, and PDF generation (86,500 stars)</li>
<li><strong><a href="https://github.com/VoltAgent/awesome-agent-skills" target="_blank" rel="noopener noreferrer"
>VoltAgent/awesome-agent-skills</a>
</strong> — curated collection of official skills from leading engineering teams</li>
<li><strong><a href="https://github.com/kodustech/awesome-agent-skills" target="_blank" rel="noopener noreferrer"
>kodustech/awesome-agent-skills</a>
</strong> — skills focused on architecture and design patterns</li>
</ul>
<p>To load any of these in ADK, clone or copy the skill directory and point <code>load_skill_from_dir</code> at it:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># Loading a community skill from any skills-compatible source</span>
</span></span><span class="line"><span class="cl"><span class="n">community_skill</span> <span class="o">=</span> <span class="n">load_skill_from_dir</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="n">pathlib</span><span class="o">.</span><span class="n">Path</span><span class="p">(</span><span class="vm">__file__</span><span class="p">)</span><span class="o">.</span><span class="n">parent</span> <span class="o">/</span> <span class="s2">&#34;skills&#34;</span> <span class="o">/</span> <span class="s2">&#34;community-skill-name&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span></code></pre></div>
<blockquote class="alert alert-note">
  <p class="alert-heading">
    <span class="alert-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path d="M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"/></svg>
    </span> Note</p>
  <p>The directory name must match the <code>name</code> field in the skill&rsquo;s SKILL.md frontmatter — ADK enforces this at load time. <a href="/posts/adk-agent-skills-part2/#pattern-2-file-based-adk-skills"
>Part 2</a>
 covers the exact error behavior.</p>
</blockquote>

<blockquote class="alert alert-warning">
  <p class="alert-heading">
    <span class="alert-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"/></svg>
    </span> Warning</p>
  <p><strong>Use external skills at your own risk.</strong> Community and third-party skills are not reviewed or endorsed by Google or the ADK team. Before loading any external skill, review its SKILL.md instructions, reference files, and scripts for unintended behavior, data exfiltration, or prompt injection. You are responsible for auditing any skill you add to your agent.</p>
</blockquote>
<h3 id="adk-core-skills-googles-official-development-skills" class="heading-anchor">ADK Core Skills: Google&rsquo;s Official Development Skills<a href="#adk-core-skills-googles-official-development-skills" class="anchor" aria-hidden="true" tabindex="-1">#</a></h3>
<p>Google publishes <a href="https://google.github.io/adk-docs/tutorials/coding-with-ai/?utm_campaign=adk-skill-design-patterns&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>official skills</a>
 that teach coding agents how to write ADK code:</p>
<table>
  <thead>
      <tr>
          <th>Skill</th>
          <th>What It Teaches</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>adk-dev-guide</code></td>
          <td>ADK architecture, agent types, tool definitions, callbacks</td>
      </tr>
      <tr>
          <td><code>adk-cheatsheet</code></td>
          <td>Quick-reference patterns for common ADK tasks</td>
      </tr>
      <tr>
          <td><code>adk-eval-guide</code></td>
          <td>Writing and running agent evaluations</td>
      </tr>
      <tr>
          <td><code>adk-deploy-guide</code></td>
          <td>Deploying ADK agents to Cloud Run and Vertex AI</td>
      </tr>
      <tr>
          <td><code>adk-observability-guide</code></td>
          <td>Tracing, logging, and monitoring ADK agents</td>
      </tr>
      <tr>
          <td><code>adk-scaffold</code></td>
          <td>Project scaffolding and directory structure</td>
      </tr>
  </tbody>
</table>
<p>Install all six globally with one command:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">npx skills add google/adk-docs -y -g
</span></span></code></pre></div><p>These are <strong>Tool Wrapper</strong> skills — the same pattern covered <a href="#pattern-1-tool-wrapper"
>above</a>
. They follow the agentskills.io specification, which means they work in Gemini CLI, Claude Code, Cursor, and any compatible agent. The ADK team dogfoods the same SKILL.md format that <a href="https://google.github.io/adk-docs/skills/?utm_campaign=adk-skill-design-patterns&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
><code>SkillToolset</code></a>
 uses at runtime — one spec powering both the development workflow (coding agents writing ADK code) and the production runtime (deployed agents loading skills on demand).</p>
<hr>
<h2 id="frequently-asked-questions" class="heading-anchor">Frequently Asked Questions<a href="#frequently-asked-questions" class="anchor" aria-hidden="true" tabindex="-1">#</a></h2>
<h3 id="can-i-use-skills-developed-in-adk-with-other-coding-agents" class="heading-anchor">Can I use skills developed in ADK with other coding agents?<a href="#can-i-use-skills-developed-in-adk-with-other-coding-agents" class="anchor" aria-hidden="true" tabindex="-1">#</a></h3>
<p>Yes — skills you develop inside ADK follow the <a href="https://agentskills.io/specification?utm_campaign=adk-skill-design-patterns&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>agentskills.io specification</a>
, the same open standard used by Gemini CLI, Antigravity, Claude Code, and OpenAI Codex. A skill authored in ADK can be loaded by any of these agents. The cross-client convention is to store shared skills in <code>&lt;project&gt;/.agents/skills/</code> or <code>~/.agents/skills/</code>. For externally authored skills (from community repos or other teams), check each agent&rsquo;s documentation for how to import and load them.</p>
<h3 id="how-many-skills-can-one-agent-have" class="heading-anchor">How many skills can one agent have?<a href="#how-many-skills-can-one-agent-have" class="anchor" aria-hidden="true" tabindex="-1">#</a></h3>
<p>No hard limit in the current ADK release (v1.25.0+, marked Experimental). <a href="https://google.github.io/adk-docs/skills/?utm_campaign=adk-skill-design-patterns&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
><code>SkillToolset</code></a>
 injects skill descriptions (~100 tokens each) on every LLM call via <a href="https://github.com/google/adk-python/tree/main/src/google/adk/tools/skill_toolset.py?utm_campaign=adk-skill-design-patterns&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
><code>process_llm_request()</code></a>
. At 50 skills, that&rsquo;s roughly 5,000-7,500 tokens of overhead per call (including XML wrapping) — still manageable for models with 128K+ context windows. Performance degrades gracefully as skill count increases.</p>
<h3 id="can-patterns-be-combined" class="heading-anchor">Can patterns be combined?<a href="#can-patterns-be-combined" class="anchor" aria-hidden="true" tabindex="-1">#</a></h3>
<p>Yes. A Pipeline skill can include Reviewer steps (the doc-pipeline&rsquo;s Step 4 is a quality review). A Generator can use Inversion to gather inputs before producing output. The <a href="https://arxiv.org/html/2602.20867v1" target="_blank" rel="noopener noreferrer"
>arXiv paper</a>
 found that production systems use a median of 2 patterns per skill, with the most common combination being metadata-driven disclosure plus marketplace distribution.</p>
<h3 id="what-about-executable-scripts-in-the-scripts-directory" class="heading-anchor">What about executable scripts in the <code>scripts/</code> directory?<a href="#what-about-executable-scripts-in-the-scripts-directory" class="anchor" aria-hidden="true" tabindex="-1">#</a></h3>
<p>Script execution via the <code>scripts/</code> directory is not yet supported in the current pip release — the <a href="https://google.github.io/adk-docs/skills/?utm_campaign=adk-skill-design-patterns&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>ADK docs</a>
 list it as a known limitation. When it ships, it will enable Pipeline and Tool Wrapper patterns with executable Python and shell scripts running directly from the skill directory. I previewed this capability in <a href="/posts/adk-agent-skills-part3/#extending-adk-skills-scripts-multi-agent-and-team-libraries"
>Part 3&rsquo;s &ldquo;What&rsquo;s Next&rdquo;</a>
.</p>
<h3 id="where-should-i-store-skills--project-level-or-user-level" class="heading-anchor">Where should I store skills — project level or user level?<a href="#where-should-i-store-skills--project-level-or-user-level" class="anchor" aria-hidden="true" tabindex="-1">#</a></h3>
<p>Project-level (<code>&lt;project&gt;/.agents/skills/</code>) for team-shared skills that live with the codebase. User-level (<code>~/.agents/skills/</code>) for personal skills across all projects. ADK uses explicit <code>load_skill_from_dir()</code> paths — you choose the directory, and the convention from the <a href="https://agentskills.io/specification?utm_campaign=adk-skill-design-patterns&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>Agent Skills spec</a>
 handles cross-client interoperability.</p>
<h3 id="how-do-i-test-a-skills-effectiveness" class="heading-anchor">How do I test a skill&rsquo;s effectiveness?<a href="#how-do-i-test-a-skills-effectiveness" class="anchor" aria-hidden="true" tabindex="-1">#</a></h3>
<p>The agentskills.io specification defines an <a href="https://agentskills.io/skill-creation/evaluating-skills?utm_campaign=adk-skill-design-patterns&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>evaluation methodology</a>
: create test cases in <code>evals/evals.json</code>, run each case with and without the skill, and measure the pass rate delta. The delta tells you exactly what the skill buys versus what it costs in context tokens.</p>
<h3 id="what-is-the-difference-between-adk-skills-and-tools" class="heading-anchor">What is the difference between ADK skills and tools?<a href="#what-is-the-difference-between-adk-skills-and-tools" class="anchor" aria-hidden="true" tabindex="-1">#</a></h3>
<p>Tools give agents the ability to take actions — call APIs, read files, query databases. Skills teach agents <em>when</em> and <em>how</em> to use those tools effectively. A tool is &ldquo;call the weather API.&rdquo; A skill is &ldquo;when the user asks about travel, check weather for each destination, compare results, and format as an itinerary.&rdquo; Skills compose on top of tools — see <a href="/posts/adk-agent-skills-part1/#what-are-skills-and-why-they-matter"
>Part 1&rsquo;s explanation</a>
 for the full distinction.</p>
<h3 id="how-do-skillmd-files-work-in-google-adk" class="heading-anchor">How do SKILL.md files work in Google ADK?<a href="#how-do-skillmd-files-work-in-google-adk" class="anchor" aria-hidden="true" tabindex="-1">#</a></h3>
<p>SKILL.md files are markdown documents with YAML frontmatter (<code>name</code>, <code>description</code>) and structured instructions. ADK&rsquo;s <a href="https://google.github.io/adk-docs/skills/?utm_campaign=adk-skill-design-patterns&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
><code>SkillToolset</code></a>
 loads them via <code>load_skill_from_dir()</code>, auto-generates three tools (<code>list_skills</code>, <code>load_skill</code>, <code>load_skill_resource</code>), and uses progressive disclosure to load full instructions only when relevant to the user&rsquo;s query. See <a href="/posts/adk-agent-skills-part2/"
>Part 2</a>
 for the complete format reference.</p>
<h3 id="which-skillmd-design-pattern-should-i-start-with" class="heading-anchor">Which SKILL.md design pattern should I start with?<a href="#which-skillmd-design-pattern-should-i-start-with" class="anchor" aria-hidden="true" tabindex="-1">#</a></h3>
<p>Start with <strong>Tool Wrapper</strong> — it&rsquo;s the simplest pattern (just instructions plus reference files) and the most widely adopted. Wrap your team&rsquo;s coding conventions or a library&rsquo;s best practices into a SKILL.md with a <code>references/</code> directory. Graduate to Generator or Reviewer when you need structured output or evaluation. The <a href="#choosing-the-right-adk-skill-pattern"
>decision tree</a>
 above can help you pick the right pattern.</p>
<h3 id="what-are-adk-core-skills-and-how-do-they-relate-to-skilltoolset" class="heading-anchor">What are ADK Core Skills and how do they relate to SkillToolset?<a href="#what-are-adk-core-skills-and-how-do-they-relate-to-skilltoolset" class="anchor" aria-hidden="true" tabindex="-1">#</a></h3>
<p>ADK Core Skills are <a href="https://github.com/google/adk-docs/tree/main/skills?utm_campaign=adk-skill-design-patterns&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>official skills</a>
 published by Google that teach coding agents (Gemini CLI, Claude Code, Cursor) how to write ADK code correctly. They follow the <strong>Tool Wrapper</strong> pattern described in this post and use the agentskills.io specification. <code>SkillToolset</code> is the runtime API that equips <em>deployed</em> production agents with skills. Both use the same SKILL.md format: Core Skills help you <em>build</em> ADK agents; SkillToolset helps your agents <em>run</em> with modular knowledge.</p>
<hr>
<h2 id="whats-next-for-adk-skills" class="heading-anchor">What&rsquo;s Next for ADK Skills<a href="#whats-next-for-adk-skills" class="anchor" aria-hidden="true" tabindex="-1">#</a></h2>
<p>Clone the <a href="https://github.com/lavinigam-gcp/build-with-adk/tree/main/adk-skill-design-patterns?utm_campaign=adk-skill-design-patterns&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>companion repo</a>
, run <a href="https://google.github.io/adk-docs/runtime/web-interface/?utm_campaign=adk-skill-design-patterns&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
><code>adk web .</code></a>
, and try each pattern. Start with the Reviewer — submit some Python code and watch the agent load the checklist and produce a scored review. Then swap <code>references/review-checklist.md</code> for your own team&rsquo;s coding standards.</p>
<p>If you&rsquo;re new to ADK Skills, start with <a href="/posts/adk-agent-skills-part1/"
>Part 1</a>
 for foundations. If you want skills that create other skills, <a href="/posts/adk-agent-skills-part3/"
>Part 3</a>
 covers the meta-skill pattern. This post is part of the <a href="/series/agent-engineering/"
>Agent Engineering series</a>
 by <a href="/about/"
>Lavi Nigam</a>
 — see <a href="/tags/adk/"
>more on ADK</a>
 for related posts.</p>
<hr>
<h2 id="references" class="heading-anchor">References<a href="#references" class="anchor" aria-hidden="true" tabindex="-1">#</a></h2>
<ol>
<li><a href="https://google.github.io/adk-docs/skills/?utm_campaign=adk-skill-design-patterns&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>Skills for ADK Agents</a>
 — Official ADK documentation for SkillToolset and progressive disclosure</li>
<li><a href="https://agentskills.io/specification?utm_campaign=adk-skill-design-patterns&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>Agent Skills Specification</a>
 — The open standard defining SKILL.md format, adopted by 30+ agent tools</li>
<li><a href="https://agentskills.io/home?utm_campaign=adk-skill-design-patterns&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>What Are Agent Skills?</a>
 — Conceptual overview and adoption list from agentskills.io</li>
<li><a href="/posts/adk-agent-skills-part1/"
>Part 1: Progressive Disclosure with SkillToolset</a>
 — Foundations: L1/L2/L3 levels, inline skills</li>
<li><a href="/posts/adk-agent-skills-part2/"
>Part 2: File-Based, External Skills, and SkillToolset Internals</a>
 — SKILL.md format, load_skill_from_dir, multi-skill loading</li>
<li><a href="/posts/adk-agent-skills-part3/"
>Part 3: Skills That Write Skills</a>
 — Meta-skill pattern, self-extending agents</li>
<li><a href="https://github.com/lavinigam-gcp/build-with-adk/tree/main/adk-skill-design-patterns?utm_campaign=adk-skill-design-patterns&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>Companion Code Repository</a>
 — Working code for all five patterns in this post</li>
<li><a href="https://github.com/google/adk-python/tree/main/src/google/adk/tools/skill_toolset.py?utm_campaign=adk-skill-design-patterns&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
><code>skill_toolset.py</code></a>
 — SkillToolset source with auto-generated tools</li>
<li><a href="https://github.com/google/adk-python/tree/main/contributing/samples/skills_agent?utm_campaign=adk-skill-design-patterns&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
><code>skills_agent</code> sample</a>
 — Official ADK sample with inline + file-based skills</li>
<li><a href="https://arxiv.org/html/2602.20867v1" target="_blank" rel="noopener noreferrer"
>SoK: Agentic Skills — Beyond Tool Use in LLM Agents</a>
 — arXiv paper (February 2026) identifying 7 system-level skill design patterns</li>
<li><a href="https://skills.sh/" target="_blank" rel="noopener noreferrer"
>skills.sh — Agent Skills Directory</a>
 — Community marketplace with 86,000+ total installs</li>
<li><a href="https://github.com/anthropics/skills" target="_blank" rel="noopener noreferrer"
>Anthropic Skills Repository</a>
 — 86,500 stars, production-grade document skills</li>
<li><a href="https://github.com/google-gemini/gemini-skills" target="_blank" rel="noopener noreferrer"
>google-gemini/gemini-skills</a>
 — Google&rsquo;s official Tool Wrapper skills for the Gemini API</li>
<li><a href="https://github.com/vercel-labs/agent-skills" target="_blank" rel="noopener noreferrer"
>vercel-labs/agent-skills</a>
 — Vercel&rsquo;s official skills for React, Next.js, and deployment patterns</li>
<li><a href="https://github.com/supabase/agent-skills" target="_blank" rel="noopener noreferrer"
>supabase/agent-skills</a>
 — Supabase&rsquo;s Postgres optimization guidelines as a Tool Wrapper skill</li>
<li><a href="https://github.com/VoltAgent/awesome-agent-skills" target="_blank" rel="noopener noreferrer"
>awesome-agent-skills (VoltAgent)</a>
 — Curated collection from leading development teams</li>
<li><a href="https://github.com/kodustech/awesome-agent-skills" target="_blank" rel="noopener noreferrer"
>awesome-agent-skills (kodustech)</a>
 — Architecture and design pattern skills</li>
<li><a href="https://agentskills.io/skill-creation/using-scripts?utm_campaign=adk-skill-design-patterns&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>Using Scripts in Skills</a>
 — Script design patterns for agentic use</li>
<li><a href="https://agentskills.io/skill-creation/evaluating-skills?utm_campaign=adk-skill-design-patterns&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>Evaluating Skills</a>
 — Eval methodology: test cases, pass rate delta</li>
<li><a href="https://medium.com/google-cloud/i-built-an-agent-skill-for-googles-adk-here-s-why-your-coding-agent-needs-one-too-e5d3a56ef81b" target="_blank" rel="noopener noreferrer"
>Giorgio Crivellari — I Built an Agent Skill for Google&rsquo;s ADK</a>
 — Reviewer pattern achieving 29% to 99% code quality</li>
<li><a href="https://google.github.io/adk-docs/tutorials/coding-with-ai/?utm_campaign=adk-skill-design-patterns&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>Coding with AI — ADK Core Skills</a>
 — Official tutorial for using ADK skills with coding agents</li>
<li><a href="https://github.com/google/adk-docs/tree/main/skills?utm_campaign=adk-skill-design-patterns&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>ADK Core Skills (GitHub)</a>
 — Source for the official ADK development skills</li>
</ol>
<hr>





<a class="card-link" href="https://github.com/lavinigam-gcp/build-with-adk/tree/main/adk-skill-design-patterns" target="_blank" rel="noopener noreferrer">
  <span class="card-link-icon">&#x1F4E6;</span>
  <div class="card-link-body">
    <p class="card-link-title">Companion Repository</p>
    <p class="card-link-desc">Clone the repo and run all five pattern examples locally with adk web .</p>
  </div>
  <span class="card-link-arrow">&#x2192;</span>
</a>






<a class="card-link" href="https://google.github.io/adk-docs/skills/" target="_blank" rel="noopener noreferrer">
  <span class="card-link-icon">&#x1F4DA;</span>
  <div class="card-link-body">
    <p class="card-link-title">ADK Skills Documentation</p>
    <p class="card-link-desc">Official guide for SkillToolset, progressive disclosure, and skill loading</p>
  </div>
  <span class="card-link-arrow">&#x2192;</span>
</a>






<a class="card-link" href="https://arxiv.org/html/2602.20867v1" target="_blank" rel="noopener noreferrer">
  <span class="card-link-icon">&#x1F4DC;</span>
  <div class="card-link-body">
    <p class="card-link-title">Agentic Skills — Beyond Tool Use in LLM Agents</p>
    <p class="card-link-desc">Research paper identifying 7 system-level skill design patterns across production agent systems</p>
  </div>
  <span class="card-link-arrow">&#x2192;</span>
</a>





<a class="btn btn-primary" href="https://github.com/lavinigam-gcp/build-with-adk/tree/main/adk-skill-design-patterns" target="_blank" rel="noopener noreferrer">
  Clone the Repo &#x2197;
</a>

]]></content:encoded>
    </item>
    <item>
      <title>ADK Agent Skills: Progressive Disclosure with SkillToolset (Part 1)</title>
      <link>https://lavinigam.com/posts/adk-agent-skills-part1/</link>
      <pubDate>Tue, 03 Mar 2026 12:00:00 +0530</pubDate>
      <guid>https://lavinigam.com/posts/adk-agent-skills-part1/</guid>
      <description>Learn how ADK Agent Skills use progressive disclosure to load knowledge on demand. Build your first inline skill with SkillToolset in this hands-on tutorial.</description>
      <content:encoded><![CDATA[
<blockquote>
  <p><strong>This is Part 1 of a 3-part series</strong> on building ADK agents with reusable skills.</p>
<ul>
<li><a href="/posts/adk-agent-skills-part2/"
>Part 2: File-Based, External Skills, and SkillToolset Internals →</a>
</li>
<li><a href="/posts/adk-agent-skills-part3/"
>Part 3: Skills That Write Skills — Self-Extending ADK Agents →</a>
</li>
<li><a href="/posts/adk-skill-design-patterns/"
>5 SKILL.md Design Patterns Every ADK Developer Should Know →</a>
</li>
<li><a href="https://google.github.io/adk-docs/tutorials/coding-with-ai/?utm_campaign=adk-agent-skills-part1&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>ADK Core Skills</a>
 — official skills for building ADK agents</li>
</ul>

</blockquote>
<p>I&rsquo;d been hearing about Agent Skills for weeks — the idea of giving agents modular knowledge they load on demand instead of cramming everything into a system prompt. I&rsquo;d even used a few with Gemini CLI. But scrolling through tutorials and X threads, I kept hitting the same question: how far can this pattern actually go with Google&rsquo;s Agent Development Kit (ADK)?</p>
<p>The <a href="https://agentskills.io/?utm_campaign=adk-agent-skills-part1&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>Agent Skills format</a>
 was originally developed by <a href="https://www.anthropic.com/" target="_blank" rel="noopener noreferrer"
>Anthropic</a>
, released as an <a href="https://github.com/agentskills/agentskills" target="_blank" rel="noopener noreferrer"
>open standard</a>
, and has been adopted by a growing list of agent products — Claude Code, GitHub Copilot, Cursor, Gemini CLI, OpenAI Codex, and <a href="https://agentskills.io/#adoption?utm_campaign=adk-agent-skills-part1&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>many more</a>
. Google publishes <a href="https://google.github.io/adk-docs/tutorials/coding-with-ai/?utm_campaign=adk-agent-skills-part1&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>official ADK development skills</a>
 that teach coding agents how to write ADK code — the same SKILL.md format powering both the development and runtime sides of the ecosystem. <a href="https://x.com/liamottley_/status/2025863592462233830" target="_blank" rel="noopener noreferrer"
>One take captured the momentum</a>
: &ldquo;SaaS is being replaced by SKILL.md files&rdquo; — 562 reactions on X.</p>
<p>My first thought was whether Skills are just another take on <a href="https://modelcontextprotocol.io/" target="_blank" rel="noopener noreferrer"
>MCP</a>
. Reading through the <a href="https://agentskills.io/what-are-skills?utm_campaign=adk-agent-skills-part1&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>agentskills.io overview</a>
, the distinction became clear. MCP gives agents access to external tools and data — it&rsquo;s the connectivity layer. Skills teach agents what to do with those tools. MCP is &ldquo;how to call a weather API.&rdquo; A skill is &ldquo;when the user asks about travel, check weather, compare destinations, and format as an itinerary.&rdquo; You need both, and they <a href="https://x.com/Pavan_Belagatti/status/2027396542815199643" target="_blank" rel="noopener noreferrer"
>compose naturally</a>
.</p>
<p>ADK adopted the same <a href="https://agentskills.io/specification?utm_campaign=adk-agent-skills-part1&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>agentskills.io specification</a>
 with its own <a href="https://google.github.io/adk-docs/skills/?utm_campaign=adk-agent-skills-part1&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>Skills integration</a>
. <a href="/about/"
>I</a>
 had a use-case sitting right in front of me: a blog-writing agent that could apply SEO checklists, follow style guides, and generate new capabilities on demand, without burning 5,000 tokens of context on every LLM call.</p>
<p>By the end of this post, you&rsquo;ll know how to:</p>
<ul>
<li>Explain <strong>progressive disclosure</strong> and why it&rsquo;s better than stuffing everything into a system prompt</li>
<li>Set up an ADK project with the <strong>skills directory structure</strong> and imports</li>
<li>Define <strong>inline skills</strong> directly in Python for simple, stable rules</li>
</ul>




<a class="btn btn-primary" href="https://github.com/lavinigam-gcp/build-with-adk/tree/main/adk-agent-skills-tutorial" target="_blank" rel="noopener noreferrer">
  Clone the Repo &#x2197;
</a>


<blockquote class="alert alert-tip">
  <p class="alert-heading">
    <span class="alert-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path d="M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z"/></svg>
    </span> Tip</p>
  <ul>
<li><strong>Progressive disclosure</strong> loads agent knowledge in three levels (L1 metadata → L2 instructions → L3 resources), fetching each only when needed</li>
<li>An agent with 10 skills starts each call with ~1,000 tokens of L1 metadata instead of ~10,000 tokens in a monolithic system prompt</li>
<li>ADK&rsquo;s <code>SkillToolset</code> auto-generates three tools (<code>list_skills</code>, <code>get_skill_details</code>, <code>load_skill_resource</code>) from any collection of SKILL.md files</li>
<li>Inline skills are the simplest pattern — a Python dict with <code>name</code>, <code>description</code>, and <code>instructions</code> keys</li>
</ul>
</blockquote>
<h2 id="what-are-skills-and-why-they-matter" class="heading-anchor">What Are Skills and Why They Matter<a href="#what-are-skills-and-why-they-matter" class="anchor" aria-hidden="true" tabindex="-1">#</a></h2>
<p><strong>Progressive disclosure</strong> is a design pattern defined in the Agent Skills specification where an agent loads knowledge in three levels — lightweight metadata (L1), full instructions (L2), and reference files (L3) — fetching each level only when needed instead of loading all instructions into every LLM call.</p>
<p>The typical way to give an agent domain knowledge is to pack everything into the system prompt. Compliance rules, style guides, API references, troubleshooting procedures — all of it concatenated into one massive instruction string. This works fine when you have two or three capabilities. At ten, the system prompt is burning through thousands of tokens on every single LLM call, whether the user&rsquo;s question is relevant to those instructions or not.</p>
<p>Skills solve this with <a href="https://agentskills.io/specification?utm_campaign=adk-agent-skills-part1&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
><strong>progressive disclosure</strong></a>
 — a design pattern defined in the Agent Skills specification. Instead of loading everything upfront, the agent sees only a lightweight listing of skill names and descriptions. When the agent decides a skill is relevant to the current query, it explicitly loads that skill&rsquo;s full instructions. If the skill references detailed documentation or templates, the agent fetches those on demand too. The spec defines three levels:</p>
<ul>
<li><strong>L1 — Metadata</strong> (~100 tokens per skill): The <code>name</code> and <code>description</code> fields from SKILL.md frontmatter. Loaded at startup for all skills. This is the &ldquo;menu&rdquo; the agent scans to decide what&rsquo;s relevant.</li>
<li><strong>L2 — Instructions</strong> (&lt;5,000 tokens recommended): The full SKILL.md body. Loaded only when the agent activates a specific skill.</li>
<li><strong>L3 — Resources</strong> (as needed): Files in <code>references/</code>, <code>assets/</code>, or <code>scripts/</code>. Loaded only when the skill&rsquo;s instructions reference them.</li>
</ul>
<p>Here&rsquo;s what that looks like in practice. Say you ask the agent &ldquo;Review my blog post for SEO.&rdquo; With the system-prompt approach, the agent already has all skill instructions in context — SEO rules, style guides, research methodology, skill-creation templates — whether it needs them or not. With progressive disclosure, the flow is different:</p>
<p><strong>L1 — The agent scans the skill listing</strong> (always present, ~400 tokens for 4 skills):</p>
<pre tabindex="0"><code>seo-checklist: SEO optimization checklist for blog posts. Covers title tags, meta descriptions...
blog-writer: Blog post writing skill with structure templates and style guidelines...
content-research-writer: Creates research-based content with SEO optimization...
skill-creator: Creates new ADK-compatible skill definitions from requirements...
</code></pre><p><strong>L2 — The agent calls <code>load_skill(&quot;seo-checklist&quot;)</code></strong> (~300 tokens loaded on demand):</p>
<pre tabindex="0"><code>When optimizing a blog post for SEO, check each item:
1. Title: 50-60 chars, primary keyword near the start
2. Meta description: 150-160 chars, includes a call-to-action
3. Headings: H2/H3 hierarchy, keywords in 2-3 headings
...
</code></pre><p><strong>L3 — If the skill references a file, the agent calls <code>load_skill_resource</code></strong> (loaded only if needed):</p>
<pre tabindex="0"><code>load_skill_resource(&#34;seo-checklist&#34;, &#34;references/seo-guidelines.md&#34;)
→ Returns the full SEO guidelines document
</code></pre><p>The three other skills stayed at L1 — the agent never loaded their instructions because it recognized the query was about SEO, not writing or research. To illustrate the savings: an agent with 10 skills, each averaging 1,000 tokens of instructions, would consume ~10,000 tokens in a system prompt on every call. The same agent using progressive disclosure starts each call with ~1,000 tokens of L1 metadata, then loads only the skill it needs. The exact savings depend on skill count and how often each skill is activated, but the pattern consistently keeps the baseline context small.</p>
<figure>
    <img loading="lazy" src="progressive-disclosure.webp"
         alt="Comparison of system prompt approach versus progressive disclosure with L1, L2, L3 levels"/> <figcaption>
            <p>System prompt approach loads all skill instructions on every call. Progressive disclosure starts with L1 metadata and loads L2/L3 only when needed. Token estimates based on the agentskills.io specification ranges.</p>
        </figcaption>
</figure>

<p>ADK implements this through the <a href="https://google.github.io/adk-docs/skills/?utm_campaign=adk-agent-skills-part1&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
><code>SkillToolset</code></a>
 class, 

<span class="badge badge-experimental">EXPERIMENTAL</span>
 introduced in <a href="https://google.github.io/adk-docs/skills/?utm_campaign=adk-agent-skills-part1&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>ADK Python v1.25.0</a>
. <code>SkillToolset</code> wraps one or more skills into three auto-generated tools — <code>list_skills</code>, <code>load_skill</code>, and <code>load_skill_resource</code> — that map directly to L1, L2, and L3. The rest of this series builds a blog-writing agent that uses all three levels across four skill patterns.</p>
<h2 id="adk-project-setup" class="heading-anchor">ADK Project Setup<a href="#adk-project-setup" class="anchor" aria-hidden="true" tabindex="-1">#</a></h2>
<p>The agent we&rsquo;re building uses a single <code>agent.py</code> with four skills wired into one <a href="https://google.github.io/adk-docs/skills/?utm_campaign=adk-agent-skills-part1&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
><code>SkillToolset</code></a>
. Each pattern trades simplicity for reusability, and they&rsquo;re ordered so that each one picks up where the previous one hits a ceiling.</p>
<table>
  <thead>
      <tr>
          <th>Pattern</th>
          <th>Source</th>
          <th>Use Case</th>
          <th>Trade-off</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>Inline</strong></td>
          <td>Python code</td>
          <td>SEO checklist — stable rules that rarely change</td>
          <td>Simplest to write, but locked to this agent</td>
      </tr>
      <tr>
          <td><strong>File-based</strong></td>
          <td>Local directory</td>
          <td>Blog writer — instructions + a style guide reference</td>
          <td>Reusable across agents, needs a directory</td>
      </tr>
      <tr>
          <td><strong>External</strong></td>
          <td>Community repo</td>
          <td>Content researcher — downloaded from <a href="https://github.com/ComposioHQ/awesome-claude-skills" target="_blank" rel="noopener noreferrer"
>awesome-claude-skills</a>
</td>
          <td>Portable across any agent that follows the spec</td>
      </tr>
      <tr>
          <td><strong>Meta</strong></td>
          <td>Inline + references</td>
          <td>Skill creator — generates new SKILL.md files on demand</td>
          <td>Self-extending agent, most complex to design</td>
      </tr>
  </tbody>
</table>
<p>The progression tells a story. Inline skills are 10 lines of Python — fast to write, but the knowledge lives only in your code. File-based skills move the knowledge to a directory with SKILL.md and reference docs, making it reusable. External skills take that same directory format from someone else&rsquo;s repo. And meta skills close the loop: the agent writes new SKILL.md files itself, following the same spec.</p>
<p>This post covers the first pattern. Parts 2 and 3 build the remaining three.</p>
<h3 id="project-structure" class="heading-anchor">Project Structure<a href="#project-structure" class="anchor" aria-hidden="true" tabindex="-1">#</a></h3>
<p>The <a href="https://github.com/google/adk-python/tree/main/contributing/samples/skills_agent/?utm_campaign=adk-agent-skills-part1&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>official skills_agent sample</a>
 uses this layout. Our blog-writing agent follows the same pattern.</p>
<div class="file-list">
  <pre>
app/
├── __init__.py
├── agent.py
├── .env
├── requirements.txt
└── skills/
    ├── blog-writer/
    │   ├── SKILL.md
    │   └── references/
    │       └── style-guide.md
    └── content-research-writer/
        ├── SKILL.md
        └── references/
            └── seo-guidelines.md
</pre>
</div>

<p>The <code>skills/</code> directory holds the file-based and external skills. Inline and meta skills are defined directly in <code>agent.py</code> — no directories needed.</p>
<h3 id="imports-and-dependencies" class="heading-anchor">Imports and Dependencies<a href="#imports-and-dependencies" class="anchor" aria-hidden="true" tabindex="-1">#</a></h3>
<p>The skill imports come from three modules.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># agent.py</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">pathlib</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">google.adk</span> <span class="kn">import</span> <span class="n">Agent</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">google.adk.skills</span> <span class="kn">import</span> <span class="n">load_skill_from_dir</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">google.adk.skills</span> <span class="kn">import</span> <span class="n">models</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">google.adk.tools.skill_toolset</span> <span class="kn">import</span> <span class="n">SkillToolset</span>
</span></span></code></pre></div><ul>
<li><strong><code>models</code></strong> — Classes for defining skills in code: <code>Skill</code>, <code>Frontmatter</code>, <code>Resources</code></li>
<li><strong><code>load_skill_from_dir</code></strong> — Reads a skill from a directory on disk (SKILL.md + references)</li>
<li><strong><code>SkillToolset</code></strong> — Packages one or more skills into a toolset the agent can call</li>
</ul>

<blockquote class="alert alert-note">
  <p class="alert-heading">
    <span class="alert-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path d="M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"/></svg>
    </span> Note</p>
  <p>Some external sources show <code>from google.adk.tools.skill import SkillToolset</code>. Both import paths work, but <code>from google.adk.tools.skill_toolset import SkillToolset</code> is the canonical one in the <a href="https://github.com/google/adk-python/tree/main/src/google/adk/tools/skill_toolset.py?utm_campaign=adk-agent-skills-part1&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>ADK source</a>
.</p>
</blockquote>
<p>Set your <code>GOOGLE_API_KEY</code> in a <code>.env</code> file in the <code>app/</code> directory before running. Install dependencies with <code>pip install google-adk python-dotenv</code>.</p>
<p>The skeleton is ready. The next section builds the first skill pattern — the simplest of the four.</p>
<h2 id="pattern-1-inline-skills" class="heading-anchor">Pattern 1: Inline Skills<a href="#pattern-1-inline-skills" class="anchor" aria-hidden="true" tabindex="-1">#</a></h2>
<p>An <strong>inline skill</strong> is the simplest Agent Skills pattern — a Python dictionary defined directly in your agent code with <code>name</code>, <code>description</code>, and <code>instructions</code> keys, ideal for small, project-specific knowledge that doesn&rsquo;t need external files.</p>
<p>The SEO checklist from the ADK Project Setup table is the simplest case — stable rules that rarely change, defined directly in Python as an <a href="https://google.github.io/adk-docs/skills/#inline-skills?utm_campaign=adk-agent-skills-part1&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>inline skill</a>
.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># agent.py — Pattern 1: Inline Skill</span>
</span></span><span class="line"><span class="cl"><span class="n">seo_skill</span> <span class="o">=</span> <span class="n">models</span><span class="o">.</span><span class="n">Skill</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="n">frontmatter</span><span class="o">=</span><span class="n">models</span><span class="o">.</span><span class="n">Frontmatter</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">        <span class="n">name</span><span class="o">=</span><span class="s2">&#34;seo-checklist&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="n">description</span><span class="o">=</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">            <span class="s2">&#34;SEO optimization checklist for blog posts. Covers title tags,&#34;</span>
</span></span><span class="line"><span class="cl">            <span class="s2">&#34; meta descriptions, heading structure, keyword placement,&#34;</span>
</span></span><span class="line"><span class="cl">            <span class="s2">&#34; and readability best practices.&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="p">),</span>
</span></span><span class="line"><span class="cl">    <span class="p">),</span>
</span></span><span class="line"><span class="cl">    <span class="n">instructions</span><span class="o">=</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;When optimizing a blog post for SEO, check each item:</span><span class="se">\n\n</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;1. **Title**: 50-60 chars, primary keyword near the start</span><span class="se">\n</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;2. **Meta description**: 150-160 chars, includes a call-to-action</span><span class="se">\n</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;3. **Headings**: H2/H3 hierarchy, keywords in 2-3 headings</span><span class="se">\n</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;4. **First paragraph**: Primary keyword in first 100 words</span><span class="se">\n</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;5. **Keyword density**: 1-2%, never forced or awkward</span><span class="se">\n</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;6. **Paragraphs**: 2-3 sentences max, use bullet lists often</span><span class="se">\n</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;7. **Links**: 2-3 internal + 3-5 external to authoritative sources</span><span class="se">\n</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;8. **Images**: Alt text with keywords, compressed, descriptive names</span><span class="se">\n</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;9. **URL slug**: Short, keyword-rich, hyphenated</span><span class="se">\n\n</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;Review the content against each item and suggest specific improvements.&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="p">),</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span></code></pre></div><p>The three fields map to the progressive disclosure levels from the previous section:</p>
<ul>
<li>
<p><strong><code>frontmatter</code></strong> (L1) — <a href="https://github.com/google/adk-python/tree/main/src/google/adk/skills/models.py?utm_campaign=adk-agent-skills-part1&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
><code>Frontmatter</code></a>
 requires two fields, both defined in the <a href="https://agentskills.io/specification?utm_campaign=adk-agent-skills-part1&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>agentskills.io spec</a>
:</p>
<ul>
<li><code>name</code> — kebab-case, max 64 characters. Must match the directory name for file-based skills.</li>
<li><code>description</code> — max 1024 characters. This is what the LLM sees during L1 discovery — it decides whether to load the skill based on this text alone. The spec recommends including &ldquo;specific keywords that help agents identify relevant tasks.&rdquo; &ldquo;SEO optimization checklist for blog posts&rdquo; tells the agent exactly when this skill is useful. &ldquo;A helpful skill&rdquo; does not.</li>
</ul>
</li>
<li>
<p><strong><code>instructions</code></strong> (L2) — The actual knowledge the agent receives when it calls <code>load_skill(&quot;seo-checklist&quot;)</code>. For this checklist, nine rules in a numbered list is all the agent needs.</p>
</li>
<li>
<p><strong><code>resources</code></strong> (L3, optional) — Reference files embedded as Python strings. Inline skills can attach these for detailed docs, but for a simple checklist, instructions alone are enough. Pattern 4 (in Part 3) uses this to embed the agentskills.io spec itself.</p>
</li>
</ul>
<p>When I asked the agent &ldquo;Can you review my blog post for SEO?&rdquo;, it loaded the seo-checklist skill and applied each item systematically.</p>
<figure>
    <img loading="lazy" src="inline-skill-seo-review.webp"
         alt="ADK Web showing the agent loading the seo-checklist inline skill to review a blog post for SEO optimization"/> <figcaption>
            <p>The agent calls load_skill(&ldquo;seo-checklist&rdquo;) to retrieve the inline skill&rsquo;s L2 instructions, then applies each checklist item to the blog post.</p>
        </figcaption>
</figure>

<p>Inline skills work best for simple, stable rules that don&rsquo;t need external files. If your skill&rsquo;s instructions grow beyond a few hundred words, or you need to reference detailed documentation, a file-based skill is a better fit.</p>
<h2 id="next-file-based-and-external-adk-skills" class="heading-anchor">Next: File-Based and External ADK Skills<a href="#next-file-based-and-external-adk-skills" class="anchor" aria-hidden="true" tabindex="-1">#</a></h2>
<p>We&rsquo;ve covered the conceptual foundation — what progressive disclosure is, why it matters, and how ADK&rsquo;s <code>SkillToolset</code> implements it — and built the simplest pattern: an inline skill defined entirely in Python.</p>
<p>In <strong>Part 2</strong>, we move beyond Python strings into real file-based skills with reference documents, external skills from community repos, and wire everything into a working agent with <code>SkillToolset</code>. We&rsquo;ll also look under the hood at the three auto-generated tools and see multi-skill loading in action. This post is part of the <a href="/series/agent-engineering/"
>full Agent Engineering series</a>
. For <a href="/tags/adk/"
>more on ADK</a>
, check the tag archive.</p>
<p><a href="/posts/adk-agent-skills-part2/"
>Continue to Part 2: File-Based, External Skills, and SkillToolset Internals →</a>
</p>
<hr>
<h2 id="frequently-asked-questions" class="heading-anchor">Frequently Asked Questions<a href="#frequently-asked-questions" class="anchor" aria-hidden="true" tabindex="-1">#</a></h2>
<p><strong>What is the difference between MCP tools and Agent Skills?</strong>
MCP (Model Context Protocol) tools give agents the ability to <em>do</em> things — call APIs, query databases, execute code. Agent Skills give agents <em>knowledge</em> — domain expertise, guidelines, and reference material loaded on demand. They are complementary: an agent uses MCP tools for actions and skills for knowledge.</p>
<p><strong>What are the three levels of progressive disclosure in ADK?</strong>
Level 1 (L1) is lightweight metadata — just the skill name and description, loaded into every call (~100 tokens per skill). Level 2 (L2) is the full instruction set, loaded only when the agent decides it needs that skill. Level 3 (L3) is supplementary resources like style guides or API references, loaded only for specific subtasks.</p>
<p><strong>How many tokens does progressive disclosure save?</strong>
For an agent with 10 skills, a monolithic system prompt approach uses approximately 10,000 tokens per call. With progressive disclosure, the agent starts with only ~1,000 tokens of L1 metadata and loads L2/L3 content on demand, reducing baseline context by roughly 90%.</p>
<p><strong>When should I use inline skills vs file-based skills?</strong>
Use inline skills for small, project-specific knowledge that won&rsquo;t be reused elsewhere (e.g., a single SEO checklist). Use file-based skills when the knowledge is reusable across projects, needs supplementary files (L3 resources), or should be version-controlled independently.</p>
<p><strong>What are ADK Core Skills?</strong>
ADK Core Skills are <a href="https://github.com/google/adk-docs/tree/main/skills?utm_campaign=adk-agent-skills-part1&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>official skills</a>
 published by Google that teach coding agents (Gemini CLI, Claude Code, Cursor) how to write ADK code. They use the same SKILL.md format and progressive disclosure pattern as <code>SkillToolset</code> — the Tool Wrapper pattern covered in the <a href="/posts/adk-skill-design-patterns/#pattern-1-tool-wrapper"
>Design Patterns post</a>
. Install them with <code>npx skills add google/adk-docs -y -g</code>.</p>
<h2 id="references" class="heading-anchor">References<a href="#references" class="anchor" aria-hidden="true" tabindex="-1">#</a></h2>
<ol>
<li><a href="https://google.github.io/adk-docs/skills/?utm_campaign=adk-agent-skills-part1&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>Skills for ADK Agents</a>
 — Official ADK documentation for SkillToolset and progressive disclosure</li>
<li><a href="https://agentskills.io/specification?utm_campaign=adk-agent-skills-part1&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>Agent Skills Specification</a>
 — The open standard defining SKILL.md format</li>
<li><a href="https://agentskills.io/what-are-skills?utm_campaign=adk-agent-skills-part1&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>What Are Agent Skills?</a>
 — Conceptual overview of skills as reusable, agent-agnostic capabilities</li>
<li><a href="https://github.com/agentskills/agentskills" target="_blank" rel="noopener noreferrer"
>agentskills/agentskills</a>
 — Open-source specification repo and reference library</li>
<li><a href="https://github.com/google/adk-python/tree/main/src/google/adk/skills/models.py?utm_campaign=adk-agent-skills-part1&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
><code>skills/models.py</code></a>
 — <code>Skill</code>, <code>Frontmatter</code>, <code>Resources</code> class definitions</li>
<li><a href="https://github.com/google/adk-python/tree/main/contributing/samples/skills_agent/?utm_campaign=adk-agent-skills-part1&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
><code>skills_agent</code> sample</a>
 — Official ADK sample with inline + file-based skills</li>
<li><a href="https://x.com/liamottley_/status/2025863592462233830" target="_blank" rel="noopener noreferrer"
>@liamottley_ — &ldquo;SaaS is being replaced by SKILL.md files&rdquo;</a>
 — 562 reactions</li>
<li><a href="https://x.com/Pavan_Belagatti/status/2027396542815199643" target="_blank" rel="noopener noreferrer"
>@Pavan_Belagatti — MCP vs Skills</a>
 — Clear MCP/Skills differentiation</li>
<li><a href="https://google.github.io/adk-docs/tutorials/coding-with-ai/?utm_campaign=adk-agent-skills-part1&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>ADK Core Skills</a>
 — official skills for building ADK agents</li>
</ol>
<hr>





<a class="card-link" href="https://github.com/lavinigam-gcp/build-with-adk/tree/main/adk-agent-skills-tutorial" target="_blank" rel="noopener noreferrer">
  <span class="card-link-icon">&#x1F4E6;</span>
  <div class="card-link-body">
    <p class="card-link-title">Companion Repository</p>
    <p class="card-link-desc">Clone the repo and run the inline skill pattern with adk web .</p>
  </div>
  <span class="card-link-arrow">&#x2192;</span>
</a>






<a class="card-link" href="https://google.github.io/adk-docs/skills/" target="_blank" rel="noopener noreferrer">
  <span class="card-link-icon">&#x1F4DA;</span>
  <div class="card-link-body">
    <p class="card-link-title">ADK Skills Documentation</p>
    <p class="card-link-desc">Official guide for SkillToolset, progressive disclosure, and skill loading</p>
  </div>
  <span class="card-link-arrow">&#x2192;</span>
</a>






<a class="card-link" href="https://agentskills.io/specification" target="_blank" rel="noopener noreferrer">
  <span class="card-link-icon">&#x1F310;</span>
  <div class="card-link-body">
    <p class="card-link-title">Agent Skills Specification</p>
    <p class="card-link-desc">The open standard adopted by 30&#43; agents for the SKILL.md format</p>
  </div>
  <span class="card-link-arrow">&#x2192;</span>
</a>





<a class="btn btn-primary" href="https://github.com/lavinigam-gcp/build-with-adk/tree/main/adk-agent-skills-tutorial" target="_blank" rel="noopener noreferrer">
  Clone the Repo &#x2197;
</a>

]]></content:encoded>
    </item>
    <item>
      <title>ADK SkillToolset: File-Based &amp; External Skills Tutorial (Part 2)</title>
      <link>https://lavinigam.com/posts/adk-agent-skills-part2/</link>
      <pubDate>Tue, 03 Mar 2026 11:00:00 +0530</pubDate>
      <guid>https://lavinigam.com/posts/adk-agent-skills-part2/</guid>
      <description>Build ADK file-based and external skills, wire them into SkillToolset, and see multi-skill progressive disclosure in action. Hands-on tutorial with code.</description>
      <content:encoded><![CDATA[
<blockquote>
  <p><strong>This is Part 2 of a 3-part series</strong> on building ADK agents with reusable skills.</p>
<ul>
<li><a href="/posts/adk-agent-skills-part1/"
>← Part 1: What Are Agent Skills?</a>
</li>
<li><a href="/posts/adk-agent-skills-part3/"
>Part 3: Skills That Write Skills — Self-Extending ADK Agents →</a>
</li>
<li><a href="/posts/adk-skill-design-patterns/"
>5 SKILL.md Design Patterns Every ADK Developer Should Know →</a>
</li>
<li><a href="https://google.github.io/adk-docs/tutorials/coding-with-ai/?utm_campaign=adk-agent-skills-part2&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>ADK Core Skills</a>
 — official skills for building ADK agents</li>
</ul>

</blockquote>
<p>In Part 1, we covered progressive disclosure — the L1/L2/L3 pattern that keeps agent context small — and built an inline SEO checklist skill in Python. Inline skills are fast to write, but the knowledge lives only in your code. This post moves beyond Python strings into ADK skills that live on disk, come from community repos, and get wired into a working agent.</p>
<p>By the end of this post, you&rsquo;ll know how to:</p>
<ul>
<li>Load <strong>file-based skills</strong> from directories with SKILL.md and reference documents</li>
<li>Integrate <strong>external skills</strong> from community repositories like <a href="https://github.com/ComposioHQ/awesome-claude-skills" target="_blank" rel="noopener noreferrer"
>awesome-claude-skills</a>
</li>
<li>Wire all skills into a single <code>SkillToolset</code> and understand its <strong>three auto-generated tools</strong></li>
<li>See <strong>multi-skill loading</strong> in action with ADK Web</li>
</ul>




<a class="btn btn-primary" href="https://github.com/lavinigam-gcp/build-with-adk/tree/main/adk-agent-skills-tutorial" target="_blank" rel="noopener noreferrer">
  Clone the Repo &#x2197;
</a>


<blockquote class="alert alert-tip">
  <p class="alert-heading">
    <span class="alert-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path d="M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z"/></svg>
    </span> Tip</p>
  <ul>
<li><strong>File-based skills</strong> store knowledge as SKILL.md files with YAML frontmatter, making skills reusable and version-controllable</li>
<li><strong>External skills</strong> load from community repos (like awesome-claude-skills), letting you import pre-built expertise</li>
<li><code>SkillToolset</code> auto-generates three tools from any skill collection: <code>list_skills</code>, <code>get_skill_details</code>, and <code>load_skill_resource</code></li>
<li>ADK validates skill names at import time — duplicate names raise a <code>ValueError</code> immediately, not at runtime</li>
</ul>
</blockquote>
<h2 id="pattern-2-file-based-adk-skills" class="heading-anchor">Pattern 2: File-Based ADK Skills<a href="#pattern-2-file-based-adk-skills" class="anchor" aria-hidden="true" tabindex="-1">#</a></h2>
<p>A <strong>file-based skill</strong> in ADK is a skill stored as a directory containing a SKILL.md file with YAML frontmatter (<code>name</code> and <code>description</code>) and Markdown instructions, plus optional <code>references/</code>, <code>assets/</code>, and <code>scripts/</code> subdirectories for L3 resources.</p>
<p>The SEO checklist worked as an inline skill because it was self-contained — nine rules, no external files. The blog writer skill needs more: a style guide with voice rules, formatting conventions, and anti-patterns. That reference document doesn&rsquo;t belong inline as a Python string. This is where <a href="https://google.github.io/adk-docs/skills/#define-skills-with-files?utm_campaign=adk-agent-skills-part2&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>file-based skills</a>
 pick up.</p>
<p>A file-based skill lives in its own directory with a SKILL.md file and optional subdirectories for references, assets, and scripts. The SKILL.md starts with YAML frontmatter, followed by Markdown instructions.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl"><span class="gh"># skills/blog-writer/SKILL.md
</span></span></span><span class="line"><span class="cl"><span class="gh"></span>---
</span></span><span class="line"><span class="cl">name: blog-writer
</span></span><span class="line"><span class="cl">description: Blog post writing skill with structure templates and style guidelines.
</span></span><span class="line"><span class="cl">  Guides the agent through writing well-structured, engaging technical blog posts
</span></span><span class="line"><span class="cl">  with proper formatting, section flow, and reader engagement techniques.
</span></span><span class="line"><span class="cl">---
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gh"># Blog Writer Instructions
</span></span></span><span class="line"><span class="cl"><span class="gh"></span>
</span></span><span class="line"><span class="cl">When asked to write a blog post, follow these steps:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gu">## Step 1: Structure
</span></span></span><span class="line"><span class="cl"><span class="gu"></span>Use <span class="sb">`load_skill_resource`</span> to read <span class="sb">`references/style-guide.md`</span> for the writing style rules.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gu">## Step 2: Outline First
</span></span></span><span class="line"><span class="cl"><span class="gu"></span>Before writing, create a brief outline with:
</span></span><span class="line"><span class="cl"><span class="k">-</span> **Hook**: Opening that grabs attention
</span></span><span class="line"><span class="cl"><span class="k">-</span> **Context**: Why this topic matters now
</span></span><span class="line"><span class="cl"><span class="k">-</span> **Core sections**: 3-5 sections that build on each other
</span></span><span class="line"><span class="cl"><span class="k">-</span> **Takeaway**: What the reader walks away knowing
</span></span><span class="line"><span class="cl">...
</span></span></code></pre></div><p>The design splits knowledge across two layers. The SKILL.md instructions (L2) tell the agent <em>what steps to follow</em>. The <code>references/style-guide.md</code> file (L3) provides the <em>detailed knowledge</em> for each step — voice guidelines, formatting conventions, anti-patterns to avoid. The agent loads the reference only when its instructions say to, via <code>load_skill_resource</code>.</p>

<blockquote class="alert alert-important">
  <p class="alert-heading">
    <span class="alert-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v9.5A1.75 1.75 0 0 1 14.25 13H8.06l-2.573 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25Zm7 2.25v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 9a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"/></svg>
    </span> Important</p>
  <p>The directory name <strong>must</strong> match the <code>name</code> field in SKILL.md frontmatter. <code>blog-writer/</code> requires <code>name: blog-writer</code>. Mismatches cause a validation error from <code>load_skill_from_dir</code> — no partial matches, no fallbacks.</p>
</blockquote>
<p>Loading a file-based skill in Python is one line.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># agent.py — Pattern 2: File-Based Skill</span>
</span></span><span class="line"><span class="cl"><span class="n">blog_writer_skill</span> <span class="o">=</span> <span class="n">load_skill_from_dir</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="n">pathlib</span><span class="o">.</span><span class="n">Path</span><span class="p">(</span><span class="vm">__file__</span><span class="p">)</span><span class="o">.</span><span class="n">parent</span> <span class="o">/</span> <span class="s2">&#34;skills&#34;</span> <span class="o">/</span> <span class="s2">&#34;blog-writer&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span></code></pre></div><p>When the agent used this skill to write a blog introduction, I could see it first loading the skill instructions (L2), then pulling the style guide via <code>load_skill_resource</code> (L3). The style guide&rsquo;s influence was visible in the output — short paragraphs, no &ldquo;In today&rsquo;s rapidly evolving&hellip;&rdquo; openings, action-oriented headings.</p>
<figure>
    <img loading="lazy" src="l3-resource-loading.webp"
         alt="Agent loads style-guide.md via load_skill_resource to apply writing rules to blog output"/> <figcaption>
            <p>L3 in action: the agent calls load_skill_resource(&ldquo;blog-writer&rdquo;, &ldquo;references/style-guide.md&rdquo;) to fetch the detailed writing rules on demand.</p>
        </figcaption>
</figure>

<p>File-based skills make the knowledge reusable — any agent that follows the agentskills.io spec can load the same <code>blog-writer/</code> directory. But you still wrote the SKILL.md yourself. What if someone else already wrote the skill you need?</p>
<h2 id="pattern-3-external-adk-skills-from-community-repos" class="heading-anchor">Pattern 3: External ADK Skills from Community Repos<a href="#pattern-3-external-adk-skills-from-community-repos" class="anchor" aria-hidden="true" tabindex="-1">#</a></h2>
<p>An <strong>external skill</strong> is a file-based skill loaded from a source outside your project — typically a community repository like awesome-claude-skills — that provides pre-built domain expertise your agent can use without you writing the instructions yourself.</p>
<p>External skills work exactly like file-based skills — the only difference is where the directory came from. Instead of writing your own SKILL.md, you download one from a community repository and load it with the same <code>load_skill_from_dir</code> call.</p>
<p>External skills aren&rsquo;t limited to community repos. Google publishes <a href="https://github.com/google/adk-docs/tree/main/skills?utm_campaign=adk-agent-skills-part2&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>official ADK development skills</a>
 — covering the dev guide, cheatsheet, evaluation, deployment, observability, and scaffolding — installable with <code>npx skills add google/adk-docs -y -g</code>. These are first-party external skills that follow the same agentskills.io spec, loadable via <code>load_skill_from_dir</code> just like the community <code>content-research-writer</code> skill below.</p>
<p>The <a href="https://github.com/ComposioHQ/awesome-claude-skills/blob/master/content-research-writer/SKILL.md" target="_blank" rel="noopener noreferrer"
><code>content-research-writer</code></a>
 skill in this agent is adapted from <a href="https://github.com/ComposioHQ/awesome-claude-skills" target="_blank" rel="noopener noreferrer"
>Composio&rsquo;s awesome-claude-skills</a>
 repository, which has over 100 production skills for various domains. The workflow for loading an external skill:</p>
<ol>
<li><strong>Find</strong> a skill that fits your use case in a community repo</li>
<li><strong>Clone or download</strong> the skill directory into your project&rsquo;s <code>skills/</code> folder</li>
<li><strong>Verify</strong> the SKILL.md frontmatter is valid (<code>skills-ref validate ./my-skill</code> if you have the <a href="https://agentskills.io/specification?utm_campaign=adk-agent-skills-part2&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>validation tool</a>
)</li>
<li><strong>Review</strong> the instructions and reference files — then load it</li>
</ol>

<blockquote class="alert alert-warning">
  <p class="alert-heading">
    <span class="alert-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"/></svg>
    </span> Warning</p>
  <p>A skill&rsquo;s instructions become your agent&rsquo;s behavior. Always read the SKILL.md and any reference files before loading an external skill. Treat it like a dependency review — you&rsquo;re giving the LLM new instructions.</p>
</blockquote>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># agent.py — Pattern 3: External Skill</span>
</span></span><span class="line"><span class="cl"><span class="n">content_researcher_skill</span> <span class="o">=</span> <span class="n">load_skill_from_dir</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="n">pathlib</span><span class="o">.</span><span class="n">Path</span><span class="p">(</span><span class="vm">__file__</span><span class="p">)</span><span class="o">.</span><span class="n">parent</span> <span class="o">/</span> <span class="s2">&#34;skills&#34;</span> <span class="o">/</span> <span class="s2">&#34;content-research-writer&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span></code></pre></div><p>The code is identical to Pattern 2. That&rsquo;s the point — the <a href="https://agentskills.io/specification?utm_campaign=adk-agent-skills-part2&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>agentskills.io spec</a>
 defines a universal directory format, so <code>load_skill_from_dir</code> doesn&rsquo;t care whether you wrote the SKILL.md or downloaded it.</p>
<p>The content-research-writer skill includes a 5-phase research methodology with detailed SEO guidelines in <code>references/seo-guidelines.md</code>. All of that knowledge becomes available to the agent with one line of code, no rewriting needed.</p>
<p>File-based and external skills cover most use cases — you either write the skill or find one that exists. But what if the skill you need doesn&rsquo;t exist in any repo? Part 3 answers that question with a meta skill that generates new skills on demand.</p>
<h3 id="pattern-summary" class="heading-anchor">Pattern Summary<a href="#pattern-summary" class="anchor" aria-hidden="true" tabindex="-1">#</a></h3>
<table>
  <thead>
      <tr>
          <th>Pattern</th>
          <th>Source</th>
          <th>Reusability</th>
          <th>Best For</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>Inline</strong></td>
          <td>Python code</td>
          <td>Single agent</td>
          <td>Simple checklists, stable rules</td>
      </tr>
      <tr>
          <td><strong>File-based</strong></td>
          <td>Local directory</td>
          <td>Any spec-compatible agent</td>
          <td>Complex skills with reference docs</td>
      </tr>
      <tr>
          <td><strong>External</strong></td>
          <td>Community repo</td>
          <td>Cross-agent portable</td>
          <td>Skills someone else already wrote</td>
      </tr>
      <tr>
          <td><strong>Meta</strong></td>
          <td>Inline + resources</td>
          <td>Self-extending</td>
          <td>Generating new skills on demand</td>
      </tr>
      <tr>
          <td><strong>Official</strong></td>
          <td>First-party repo</td>
          <td>Cross-agent portable</td>
          <td>Google-published skills (ADK Core Skills)</td>
      </tr>
  </tbody>
</table>
<h2 id="wiring-adk-skills-with-skilltoolset" class="heading-anchor">Wiring ADK Skills with SkillToolset<a href="#wiring-adk-skills-with-skilltoolset" class="anchor" aria-hidden="true" tabindex="-1">#</a></h2>
<p><strong>SkillToolset</strong> is ADK&rsquo;s built-in <code>BaseToolset</code> subclass that converts any collection of Agent Skills into three auto-generated tools — <code>list_skills</code> (returns L1 metadata for all skills), <code>get_skill_details</code> (loads L2 instructions for a specific skill), and <code>load_skill_resource</code> (fetches L3 reference files).</p>
<p>With all four skills defined (inline SEO checklist from Part 1, file-based blog writer, external content researcher, and the meta skill-creator coming in Part 3), the final step is packaging them into a <a href="https://github.com/google/adk-python/tree/main/src/google/adk/tools/skill_toolset.py?utm_campaign=adk-agent-skills-part2&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
><code>SkillToolset</code></a>
 and handing it to the agent.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># agent.py — Assemble and wire up</span>
</span></span><span class="line"><span class="cl"><span class="n">skill_toolset</span> <span class="o">=</span> <span class="n">SkillToolset</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="n">skills</span><span class="o">=</span><span class="p">[</span><span class="n">seo_skill</span><span class="p">,</span> <span class="n">blog_writer_skill</span><span class="p">,</span> <span class="n">content_researcher_skill</span><span class="p">,</span> <span class="n">skill_creator</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">root_agent</span> <span class="o">=</span> <span class="n">Agent</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="n">model</span><span class="o">=</span><span class="s2">&#34;gemini-2.5-flash&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">name</span><span class="o">=</span><span class="s2">&#34;blog_skills_agent&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">description</span><span class="o">=</span><span class="s2">&#34;A blog-writing agent powered by reusable skills.&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">instruction</span><span class="o">=</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;You are a blog-writing assistant with specialized skills.</span><span class="se">\n\n</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;You have four skills available:</span><span class="se">\n</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;- **seo-checklist**: SEO optimization rules</span><span class="se">\n</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;- **blog-writer**: Writing structure and style guide</span><span class="se">\n</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;- **content-research-writer**: Research methodology</span><span class="se">\n</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;- **skill-creator**: Generate new skill definitions</span><span class="se">\n\n</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;When the user asks you to write, research, or optimize:</span><span class="se">\n</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;1. Load the relevant skill(s) to get detailed instructions</span><span class="se">\n</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;2. Use load_skill_resource to access reference materials</span><span class="se">\n</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;3. Follow the skill&#39;s step-by-step instructions</span><span class="se">\n\n</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;Always explain which skill you&#39;re using and why.&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="p">),</span>
</span></span><span class="line"><span class="cl">    <span class="n">tools</span><span class="o">=</span><span class="p">[</span><span class="n">skill_toolset</span><span class="p">],</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span></code></pre></div><p>The agent&rsquo;s <code>instruction</code> explicitly lists the four skills. This overlaps with <code>SkillToolset</code>&rsquo;s auto-injected listing, but serves a different purpose — the instruction provides a stable hint about the agent&rsquo;s identity, while the dynamic <code>list_skills</code> injection gives the LLM structured metadata for each request.</p>
<h3 id="under-the-hood-three-auto-generated-tools" class="heading-anchor">Under the Hood: Three Auto-Generated Tools<a href="#under-the-hood-three-auto-generated-tools" class="anchor" aria-hidden="true" tabindex="-1">#</a></h3>
<p><code>SkillToolset</code> is not a regular tool — it&rsquo;s a <a href="https://github.com/google/adk-python/tree/main/src/google/adk/tools/skill_toolset.py?utm_campaign=adk-agent-skills-part2&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
><code>BaseToolset</code></a>
, which means its <code>get_tools()</code> method is called on every LLM step. It auto-registers three tools that map directly to progressive disclosure:</p>
<ul>
<li>
<p><strong><code>list_skills</code></strong> (L1) — Returns an XML listing of all skill names and descriptions. Injected into the system context automatically via <code>process_llm_request()</code> — the agent never calls it explicitly. Always present, always lightweight.</p>
</li>
<li>
<p><strong><code>load_skill</code></strong> (L2) — Takes a skill name and returns its full instructions plus frontmatter. The agent calls this when it decides a skill is relevant to the current query.</p>
</li>
<li>
<p><strong><code>load_skill_resource</code></strong> (L3) — Takes a skill name and a file path, returning the content of a file from <code>references/</code>, <code>assets/</code>, or <code>scripts/</code>. Detailed knowledge loaded only on demand.</p>
</li>
</ul>
<figure>
    <img loading="lazy" src="skilltoolset-flow.webp"
         alt="SkillToolset flow showing list_skills injection, load_skill, and load_skill_resource tool sequence"/> <figcaption>
            <p>SkillToolset&rsquo;s three auto-generated tools: list_skills (L1, injected automatically), load_skill (L2, on demand), and load_skill_resource (L3, on demand).</p>
        </figcaption>
</figure>

<figure>
    <img loading="lazy" src="skilltoolset-agent-graph.webp"
         alt="Agent graph showing blog_skills_agent with the three auto-registered SkillToolset tools and function call details"/> <figcaption>
            <p>ADK Web&rsquo;s agent graph view showing blog_skills_agent connected to the three SkillToolset tools, with function call arguments and token counts visible.</p>
        </figcaption>
</figure>


<blockquote class="alert alert-note">
  <p class="alert-heading">
    <span class="alert-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path d="M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"/></svg>
    </span> Note</p>
  <p><code>SkillToolset</code> validates skill names at construction time and raises a <code>ValueError</code> if any two skills share the same name. This happens at import time, not at runtime — so you&rsquo;ll catch duplicates immediately.</p>
</blockquote>
<h2 id="running-it-progressive-disclosure-in-action" class="heading-anchor">Running It: Progressive Disclosure in Action<a href="#running-it-progressive-disclosure-in-action" class="anchor" aria-hidden="true" tabindex="-1">#</a></h2>
<p>Running the agent with <a href="https://google.github.io/adk-docs/runtime/web-interface/?utm_campaign=adk-agent-skills-part2&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>ADK Web</a>
 shows the progressive disclosure pattern visually.</p>

<blockquote class="alert alert-warning">
  <p class="alert-heading">
    <span class="alert-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"/></svg>
    </span> Warning</p>
  <p>Use <code>adk web .</code> not <code>adk web app/</code> — pointing at <code>app/</code> directly makes ADK discover <code>skills/</code> as a separate app instead of treating <code>app/</code> as your app.</p>
</blockquote>
<p>When I asked &ldquo;Help me write a blog introduction and make it SEO-friendly&rdquo;, the agent loaded both the <code>blog-writer</code> and <code>seo-checklist</code> skills in parallel — without being told to load both. The L1 metadata listing gave it enough context to decide both skills were relevant. It then called <code>load_skill_resource</code> to read the style guide, and produced an introduction that followed both skills&rsquo; instructions.</p>
<figure>
    <img loading="lazy" src="multi-skill-parallel-loading.webp"
         alt="Agent loads blog-writer and seo-checklist skills in parallel with load_skill_resource for style guide"/> <figcaption>
            <p>Multi-skill loading: the agent autonomously loads both blog-writer and seo-checklist in the same turn, then fetches the style guide via load_skill_resource.</p>
        </figcaption>
</figure>

<p>The ADK Web UI makes the flow visible through tool call badges. Each badge shows the tool name and its status (pending → complete). In this interaction, four events fired: <code>load_skill(&quot;blog-writer&quot;)</code> and <code>load_skill(&quot;seo-checklist&quot;)</code> in the same turn, followed by <code>load_skill_resource(&quot;references/style-guide.md&quot;)</code>, and finally the agent&rsquo;s written response.</p>
<p>The agent&rsquo;s reasoning is also interesting in the negative case. When I asked &ldquo;Can you use your video-editing skill to create a thumbnail?&rdquo;, the agent checked the L1 listing and correctly responded that it has no video-editing skill. It listed all four available skills instead. No hallucination, no attempt to fake a capability it doesn&rsquo;t have.</p>
<h2 id="next-adk-meta-skills-that-write-themselves" class="heading-anchor">Next: ADK Meta Skills That Write Themselves<a href="#next-adk-meta-skills-that-write-themselves" class="anchor" aria-hidden="true" tabindex="-1">#</a></h2>
<p>We&rsquo;ve covered skills that exist — skills you write yourself (inline, file-based) or find in community repos (external). We&rsquo;ve wired them into a <code>SkillToolset</code> and seen multi-skill loading in action. This tutorial is part of the <a href="/series/agent-engineering/"
>full Agent Engineering series</a>
 by <a href="/about/"
>Lavi Nigam</a>
 — see <a href="/tags/adk/"
>more on ADK</a>
 for related posts.</p>
<p>In <strong>Part 3</strong>, the agent writes its own skills. We&rsquo;ll build a meta skill-creator that generates new SKILL.md files on demand, reflect on what skills change about agent behavior, and explore what&rsquo;s coming next for the pattern.</p>
<p><a href="/posts/adk-agent-skills-part3/"
>Continue to Part 3: Skills That Write Skills — Self-Extending ADK Agents →</a>
</p>
<hr>
<h2 id="frequently-asked-questions" class="heading-anchor">Frequently Asked Questions<a href="#frequently-asked-questions" class="anchor" aria-hidden="true" tabindex="-1">#</a></h2>
<p><strong>Can I mix file-based and inline skills in the same SkillToolset?</strong>
Yes. <code>SkillToolset</code> accepts any list of skill sources. You can combine inline Python dicts, file-based skill directories, and external skill paths in a single <code>skills=[]</code> parameter. The toolset treats them identically once loaded.</p>
<p><strong>What happens if a SKILL.md file has invalid YAML frontmatter?</strong>
ADK&rsquo;s skill loader will raise a parsing error at import time, before your agent starts. The frontmatter must include valid YAML with at least <code>name</code> and <code>description</code> fields. Missing or malformed frontmatter prevents the skill from loading.</p>
<p><strong>What are the three tools auto-generated by SkillToolset?</strong>
<code>list_skills</code> returns L1 metadata (name and description) for all registered skills. <code>get_skill_details</code> loads the full L2 instructions for a specific skill by name. <code>load_skill_resource</code> fetches L3 reference files from a skill&rsquo;s <code>references/</code> directory. The agent calls these tools autonomously based on the user&rsquo;s query.</p>
<p><strong>Is there a size limit for SKILL.md files or L3 resources?</strong>
The Agent Skills specification does not impose hard size limits, but practical constraints apply. L2 instructions should fit within the model&rsquo;s context window alongside the conversation. L3 resources are loaded individually, so each file should be self-contained and reasonably sized (a few thousand tokens).</p>
<p><strong>How does SkillToolset handle duplicate skill names?</strong>
It raises a <code>ValueError</code> at import time if any two skills share the same <code>name</code> field. This happens before the agent starts, so you get an immediate, clear error rather than confusing runtime behavior.</p>
<p><strong>Can I load ADK Core Skills with SkillToolset?</strong>
Yes. Google publishes <a href="https://github.com/google/adk-docs/tree/main/skills?utm_campaign=adk-agent-skills-part2&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>official ADK development skills</a>
 as standard SKILL.md directories. Since they follow the agentskills.io specification, you can load them with <code>load_skill_from_dir</code> exactly like any file-based or external skill. Install with <code>npx skills add google/adk-docs -y -g</code>, then point <code>load_skill_from_dir</code> at the installed directory.</p>
<hr>
<h2 id="references" class="heading-anchor">References<a href="#references" class="anchor" aria-hidden="true" tabindex="-1">#</a></h2>
<ol>
<li><a href="https://google.github.io/adk-docs/skills/?utm_campaign=adk-agent-skills-part2&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>Skills for ADK Agents</a>
 — Official ADK documentation for SkillToolset and progressive disclosure</li>
<li><a href="https://agentskills.io/specification?utm_campaign=adk-agent-skills-part2&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>Agent Skills Specification</a>
 — The open standard defining SKILL.md format, adopted by 40+ agents</li>
<li><a href="https://docs.cloud.google.com/agent-builder/agent-development-kit/overview?utm_campaign=adk-agent-skills-part2&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>ADK Overview (Vertex AI)</a>
 — Google Cloud documentation for Agent Development Kit</li>
<li><a href="https://github.com/google/adk-python/tree/main/src/google/adk/tools/skill_toolset.py?utm_campaign=adk-agent-skills-part2&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
><code>tools/skill_toolset.py</code></a>
 — <code>SkillToolset</code> implementation with auto-generated tools</li>
<li><a href="https://github.com/google/adk-python/tree/main/src/google/adk/skills/_utils.py?utm_campaign=adk-agent-skills-part2&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
><code>skills/_utils.py</code></a>
 — <code>load_skill_from_dir</code>, validation, SKILL.md parsing</li>
<li><a href="https://github.com/google/adk-python/tree/main/contributing/samples/skills_agent/?utm_campaign=adk-agent-skills-part2&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
><code>skills_agent</code> sample</a>
 — Official ADK sample with inline + file-based skills</li>
<li><a href="https://github.com/ComposioHQ/awesome-claude-skills" target="_blank" rel="noopener noreferrer"
>awesome-claude-skills</a>
 — 100+ production skills organized by domain</li>
<li><a href="https://github.com/ComposioHQ/awesome-claude-skills/blob/master/content-research-writer/SKILL.md" target="_blank" rel="noopener noreferrer"
>content-research-writer</a>
 — The external skill used in this tutorial</li>
<li><a href="https://github.com/google/adk-docs/tree/main/skills?utm_campaign=adk-agent-skills-part2&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>ADK Core Skills</a>
 — official skills for building ADK agents</li>
</ol>
<hr>





<a class="card-link" href="https://github.com/lavinigam-gcp/build-with-adk/tree/main/adk-agent-skills-tutorial" target="_blank" rel="noopener noreferrer">
  <span class="card-link-icon">&#x1F4E6;</span>
  <div class="card-link-body">
    <p class="card-link-title">Companion Repository</p>
    <p class="card-link-desc">Clone the repo and run file-based and external skill patterns with adk web .</p>
  </div>
  <span class="card-link-arrow">&#x2192;</span>
</a>






<a class="card-link" href="https://google.github.io/adk-docs/skills/" target="_blank" rel="noopener noreferrer">
  <span class="card-link-icon">&#x1F4DA;</span>
  <div class="card-link-body">
    <p class="card-link-title">ADK Skills Documentation</p>
    <p class="card-link-desc">Official guide for SkillToolset, progressive disclosure, and skill loading</p>
  </div>
  <span class="card-link-arrow">&#x2192;</span>
</a>






<a class="card-link" href="https://agentskills.io/specification" target="_blank" rel="noopener noreferrer">
  <span class="card-link-icon">&#x1F310;</span>
  <div class="card-link-body">
    <p class="card-link-title">Agent Skills Specification</p>
    <p class="card-link-desc">The open standard adopted by 30&#43; agents for the SKILL.md format</p>
  </div>
  <span class="card-link-arrow">&#x2192;</span>
</a>





<a class="btn btn-primary" href="https://github.com/lavinigam-gcp/build-with-adk/tree/main/adk-agent-skills-tutorial" target="_blank" rel="noopener noreferrer">
  Clone the Repo &#x2197;
</a>

]]></content:encoded>
    </item>
    <item>
      <title>Self-Extending ADK Agents: Meta Skills That Write SKILL.md Files (Part 3)</title>
      <link>https://lavinigam.com/posts/adk-agent-skills-part3/</link>
      <pubDate>Tue, 03 Mar 2026 10:00:00 +0530</pubDate>
      <guid>https://lavinigam.com/posts/adk-agent-skills-part3/</guid>
      <description>Build an ADK meta skill that generates new SKILL.md files on demand. Turn your agent into a self-extending system that creates reusable skills automatically.</description>
      <content:encoded><![CDATA[
<blockquote>
  <p><strong>This is Part 3 of a 3-part series</strong> on building ADK agents with reusable skills.</p>
<ul>
<li><a href="/posts/adk-agent-skills-part1/"
>← Part 1: What Are Agent Skills?</a>
</li>
<li><a href="/posts/adk-agent-skills-part2/"
>← Part 2: File-Based, External Skills, and SkillToolset Internals</a>
</li>
<li><a href="/posts/adk-skill-design-patterns/"
>5 SKILL.md Design Patterns Every ADK Developer Should Know →</a>
</li>
<li><a href="https://google.github.io/adk-docs/tutorials/coding-with-ai/?utm_campaign=adk-agent-skills-part3&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>ADK Core Skills</a>
 — official skills for building ADK agents</li>
</ul>

</blockquote>
<p>In Parts 1 and 2, we built ADK skills that exist — an inline SEO checklist, file-based and external skills loaded from directories, all wired into a <code>SkillToolset</code> with three auto-generated tools. Part 3 closes the loop: the agent writes its own skills.</p>
<p>By the end of this post, you&rsquo;ll know how to:</p>
<ul>
<li>Build a <strong>meta skill</strong> that generates new SKILL.md files following the agentskills.io spec</li>
<li>Understand how <strong>self-extending agents</strong> change the economics of capability building</li>
<li>Recognize how skills change <strong>agent decision-making</strong>, not just knowledge</li>
</ul>




<a class="btn btn-primary" href="https://github.com/lavinigam-gcp/build-with-adk/tree/main/adk-agent-skills-tutorial" target="_blank" rel="noopener noreferrer">
  Clone the Repo &#x2197;
</a>


<blockquote class="alert alert-tip">
  <p class="alert-heading">
    <span class="alert-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path d="M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z"/></svg>
    </span> Tip</p>
  <ul>
<li>A <strong>meta skill</strong> teaches the agent to generate new SKILL.md files on demand, following the agentskills.io specification</li>
<li>Self-extending agents can expand their own capabilities without human intervention by writing and loading new skill definitions at runtime</li>
<li>Skills change the agent&rsquo;s <em>decision-making</em>, not just its knowledge — they reshape how the agent approaches problems</li>
<li>Giorgio Crivellari&rsquo;s ADK governance skill improved code correctness from 29% to 99%, demonstrating the power of well-structured skills</li>
</ul>
</blockquote>
<h2 id="pattern-4-adk-meta-skills-that-write-skillmd-files" class="heading-anchor">Pattern 4: ADK Meta Skills That Write SKILL.md Files<a href="#pattern-4-adk-meta-skills-that-write-skillmd-files" class="anchor" aria-hidden="true" tabindex="-1">#</a></h2>
<p>A <strong>meta skill</strong> is a skill whose purpose is to generate new SKILL.md files — it teaches the agent how to create additional skills on demand, following the agentskills.io specification. An agent equipped with a meta skill becomes <strong>self-extending</strong>: it can expand its own capabilities without human intervention by writing and loading new skill definitions at runtime.</p>
<p>The first three patterns cover skills that exist — you write them (inline, file-based) or find them (external). Pattern 4 closes the loop: the agent writes new skills itself.</p>
<p>The <code>skill-creator</code> is an inline skill whose instructions explain how to write SKILL.md files, and whose <code>resources</code> contain the <a href="https://agentskills.io/specification?utm_campaign=adk-agent-skills-part3&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>agentskills.io specification</a>
 and a working example. This is where the <code>resources</code> field from Pattern 1 becomes essential.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># agent.py — Pattern 4: Meta Skill</span>
</span></span><span class="line"><span class="cl"><span class="n">skill_creator</span> <span class="o">=</span> <span class="n">models</span><span class="o">.</span><span class="n">Skill</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="n">frontmatter</span><span class="o">=</span><span class="n">models</span><span class="o">.</span><span class="n">Frontmatter</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">        <span class="n">name</span><span class="o">=</span><span class="s2">&#34;skill-creator&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="n">description</span><span class="o">=</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">            <span class="s2">&#34;Creates new ADK-compatible skill definitions from requirements.&#34;</span>
</span></span><span class="line"><span class="cl">            <span class="s2">&#34; Generates complete SKILL.md files following the Agent Skills&#34;</span>
</span></span><span class="line"><span class="cl">            <span class="s2">&#34; specification at agentskills.io.&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="p">),</span>
</span></span><span class="line"><span class="cl">    <span class="p">),</span>
</span></span><span class="line"><span class="cl">    <span class="n">instructions</span><span class="o">=</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;When asked to create a new skill, generate a complete SKILL.md file.</span><span class="se">\n\n</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;Read `references/skill-spec.md` for the format specification.</span><span class="se">\n</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;Read `references/example-skill.md` for a working example.</span><span class="se">\n\n</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;Follow these rules:</span><span class="se">\n</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;1. Name must be kebab-case, max 64 characters</span><span class="se">\n</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;2. Description must be under 1024 characters</span><span class="se">\n</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;3. Instructions should be clear, step-by-step</span><span class="se">\n</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;4. Reference files in references/ for detailed domain knowledge</span><span class="se">\n</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;5. Keep SKILL.md under 500 lines — put details in references/</span><span class="se">\n</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;6. Output the complete file content the user can save directly</span><span class="se">\n</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="p">),</span>
</span></span><span class="line"><span class="cl">    <span class="n">resources</span><span class="o">=</span><span class="n">models</span><span class="o">.</span><span class="n">Resources</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">        <span class="n">references</span><span class="o">=</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="c1"># Full content in agent.py — abbreviated here for readability</span>
</span></span><span class="line"><span class="cl">            <span class="s2">&#34;skill-spec.md&#34;</span><span class="p">:</span> <span class="s2">&#34;# Agent Skills Specification (agentskills.io)...&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">            <span class="s2">&#34;example-skill.md&#34;</span><span class="p">:</span> <span class="s2">&#34;# Example: Code Review Skill...&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">),</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span></code></pre></div><p>The resources embed the agentskills.io spec as <code>skill-spec.md</code> and a working code-review skill as <code>example-skill.md</code>. When asked to create a new skill, the agent loads the skill-creator, reads both references via <code>load_skill_resource</code>, and generates a complete SKILL.md that follows the spec. The pattern is inspired by <a href="https://github.com/obra/superpowers/blob/main/skills/writing-skills/SKILL.md" target="_blank" rel="noopener noreferrer"
>obra/superpowers&rsquo; writing-skills skill</a>
, which teaches Claude Code how to write new skills.</p>
<p><a href="/about/"
>Lavi Nigam</a>
 tested this by asking: &ldquo;I need a new skill for reviewing Python code for security vulnerabilities. Can you create a SKILL.md for it?&rdquo; The agent loaded the skill-creator, read the spec and example, and generated a complete <code>python-security-review</code> skill — valid kebab-case naming, structured instructions covering input validation, authentication, and cryptography, and a severity-based reporting format.</p>
<figure>
    <img loading="lazy" src="meta-skill-creator-output.webp"
         alt="Agent generates a python-security-review SKILL.md with frontmatter, instructions, and references"/> <figcaption>
            <p>The skill-creator meta skill generates a complete python-security-review SKILL.md with valid frontmatter, step-by-step instructions, and a severity-based reporting format.</p>
        </figcaption>
</figure>

<p>A skill is just a SKILL.md file. An LLM can generate text. That means an agent with a skill-writing skill becomes self-extending — it can create new domain expertise on demand, then load it via <code>load_skill_from_dir</code> in the next session. The generated skills follow the same agentskills.io spec, so they work not just in ADK but in any compatible agent.</p>
<h2 id="what-building-adk-skills-taught-me" class="heading-anchor">What Building ADK Skills Taught Me<a href="#what-building-adk-skills-taught-me" class="anchor" aria-hidden="true" tabindex="-1">#</a></h2>
<p><strong>Skills change the agent&rsquo;s decision-making, not just its knowledge.</strong> When an agent loads a skill, it doesn&rsquo;t just gain new information — it gains a new way of approaching problems. The skill reshapes the agent&rsquo;s reasoning process, not just its reference material.</p>
<p>For a simple SEO review, the agent loaded one skill. For writing, two in parallel. For skill creation, it chained <code>load_skill</code> → <code>load_skill_resource</code> → <code>load_skill_resource</code> → generate. The L1 listing acts as a menu — the agent composes skills based on the task, with no orchestration in the system prompt.</p>
<p>Quality improved more than token usage. With the blog-writer&rsquo;s style guide as an L3 resource, anti-patterns were eliminated at generation time. Giorgio Crivellari <a href="https://medium.com/google-cloud/i-built-an-agent-skill-for-googles-adk-here-s-why-your-coding-agent-needs-one-too-e5d3a56ef81b" target="_blank" rel="noopener noreferrer"
>documented a similar effect</a>
: his ADK governance skill took code correctness from 29% to 99%.</p>
<p>And the meta skill makes it self-extending — an agent that writes SKILL.md files on demand, following the same agentskills.io spec, working across any compatible agent. Instead of pre-building every capability, build one meta skill and let the agent generate the rest. See <a href="/tags/adk/"
>more on ADK</a>
 for related posts.</p>

<blockquote class="alert alert-warning">
  <p class="alert-heading">
    <span class="alert-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"/></svg>
    </span> Warning</p>
  <p>When running <a href="https://google.github.io/adk-docs/runtime/api-server/?utm_campaign=adk-agent-skills-part3&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
><code>adk api_server</code></a>
, use <code>adk api_server .</code> not <code>adk api_server app/</code>. ADK looks inside the target directory for sub-applications — if <code>app/</code> contains a <code>skills/</code> subdirectory, it discovers &ldquo;skills&rdquo; as a separate app instead of treating <code>app/</code> as your app. Check with <code>curl localhost:8000/list-apps</code> if the agent isn&rsquo;t loading.</p>
</blockquote>
<h2 id="extending-adk-skills-scripts-multi-agent-and-team-libraries" class="heading-anchor">Extending ADK Skills: Scripts, Multi-Agent, and Team Libraries<a href="#extending-adk-skills-scripts-multi-agent-and-team-libraries" class="anchor" aria-hidden="true" tabindex="-1">#</a></h2>
<p>Three directions to explore from here:</p>
<ul>
<li><strong>Script execution</strong> — The ADK source contains a <a href="https://github.com/google/adk-python/tree/main/src/google/adk/tools/skill_toolset.py?utm_campaign=adk-agent-skills-part3&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
><code>RunSkillScriptTool</code></a>
 that executes Python and shell scripts from the <code>scripts/</code> directory. The docs say &ldquo;not yet supported,&rdquo; but the implementation is functional. Skills that can run code, not just provide instructions.</li>
<li><strong>Multi-agent + Skills</strong> — A <a href="https://google.github.io/adk-docs/agents/workflow-agents/sequential-agents/?utm_campaign=adk-agent-skills-part3&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
><code>SequentialAgent</code></a>
 pipeline where a researcher agent loads the content-research-writer skill and feeds into a writer agent with the blog-writer skill. SkillToolset becomes a modular knowledge layer across your entire agent system.</li>
<li><strong>Team skill libraries</strong> — Share skills via git repos, version them with tags, load them into any agent that follows the agentskills.io spec. Google does this with <a href="https://github.com/google/adk-docs/tree/main/skills?utm_campaign=adk-agent-skills-part3&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>official ADK development skills</a>
 — a curated library installable via <code>npx skills add google/adk-docs -y -g</code> into Gemini CLI, Claude Code, or Cursor. A team-specific library raises the quality floor the way Giorgio&rsquo;s governance skill did.</li>
</ul>
<p>Clone the <a href="https://github.com/lavinigam-gcp/build-with-adk/tree/main/adk-agent-skills-tutorial?utm_campaign=adk-agent-skills-part3&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>companion repo</a>
, install dependencies, set your API key, and run <code>adk web .</code> from the project root to see all four patterns in action. Swap in your own SKILL.md files under <code>app/skills/</code>, or ask the skill-creator to generate one for your domain.</p>





<a class="card-link" href="https://github.com/lavinigam-gcp/build-with-adk/tree/main/adk-agent-skills-tutorial" target="_blank" rel="noopener noreferrer">
  <span class="card-link-icon">&#x1F4E6;</span>
  <div class="card-link-body">
    <p class="card-link-title">Companion Repository</p>
    <p class="card-link-desc">Clone the repo and run all four skill patterns</p>
  </div>
  <span class="card-link-arrow">&#x2192;</span>
</a>






<a class="card-link" href="https://google.github.io/adk-docs/skills/" target="_blank" rel="noopener noreferrer">
  <span class="card-link-icon">&#x1F4DA;</span>
  <div class="card-link-body">
    <p class="card-link-title">ADK Skills Documentation</p>
    <p class="card-link-desc">Official guide for defining and using skills in ADK</p>
  </div>
  <span class="card-link-arrow">&#x2192;</span>
</a>






<a class="card-link" href="https://agentskills.io/specification" target="_blank" rel="noopener noreferrer">
  <span class="card-link-icon">&#x1F310;</span>
  <div class="card-link-body">
    <p class="card-link-title">Agent Skills Specification</p>
    <p class="card-link-desc">The open standard adopted by 40&#43; agents</p>
  </div>
  <span class="card-link-arrow">&#x2192;</span>
</a>

<h2 id="series-summary" class="heading-anchor">Series Summary<a href="#series-summary" class="anchor" aria-hidden="true" tabindex="-1">#</a></h2>
<p>Across the <a href="/series/agent-engineering/"
>full Agent Engineering series</a>
, we built a blog-writing agent with four progressively more powerful skill patterns:</p>
<ol>
<li><strong>Part 1</strong> — The concept: progressive disclosure (L1/L2/L3), project setup, and inline skills defined in Python</li>
<li><strong>Part 2</strong> — The ecosystem: file-based skills with reference docs, external skills from community repos, <code>SkillToolset</code> internals, and multi-skill loading</li>
<li><strong>Part 3</strong> — The meta pattern: a skill that writes new skills, self-extending agents, and the quality impact of modular knowledge</li>
</ol>
<p>The core idea: skills turn a monolithic system prompt into a modular knowledge layer. The agent decides what to load, when to load it, and how to compose multiple skills for complex tasks. That shift — from &ldquo;everything always present&rdquo; to &ldquo;load on demand&rdquo; — changes not just token efficiency but agent behavior itself.</p>
<p>The ecosystem validates this: Google&rsquo;s <a href="https://google.github.io/adk-docs/tutorials/coding-with-ai/?utm_campaign=adk-agent-skills-part3&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>ADK Core Skills</a>
 use the same SKILL.md format to teach coding agents how to build ADK applications — the specification powering both the tools that write agents and the agents themselves.</p>
<h2 id="frequently-asked-questions" class="heading-anchor">Frequently Asked Questions<a href="#frequently-asked-questions" class="anchor" aria-hidden="true" tabindex="-1">#</a></h2>
<p><strong>Can generated skills be loaded in the same session?</strong>
Yes. After the meta skill writes a new SKILL.md file to disk, you can add its directory to the <code>SkillToolset</code> and the agent can use it immediately. In practice, reloading the agent with the new skill directory is the cleanest approach.</p>
<p><strong>How do you version-control generated skills?</strong>
Treat generated SKILL.md files like any other code artifact — commit them to git. The meta skill writes to a designated output directory, and you review and commit the generated files. This preserves the audit trail and lets you refine generated skills over time.</p>
<p><strong>What prevents the agent from generating harmful or incorrect skills?</strong>
The meta skill&rsquo;s instructions define the output format and quality constraints. You can add guardrails like requiring specific sections, mandating safety disclaimers, or restricting the domains the agent can generate skills for. The generated SKILL.md files are also human-readable, so you review them before deployment.</p>
<p><strong>Does the meta skill work with models other than Gemini?</strong>
The meta skill pattern is model-agnostic — it generates text files following the agentskills.io specification. Any LLM that can follow structured output instructions can generate valid SKILL.md files. ADK itself supports multiple model backends.</p>
<p><strong>How do ADK Core Skills relate to the meta skill pattern?</strong>
ADK Core Skills are <a href="https://github.com/google/adk-docs/tree/main/skills?utm_campaign=adk-agent-skills-part3&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>official skills</a>
 covering ADK development, evaluation, deployment, and observability. The meta skill pattern from this post generates <em>new</em> skills on demand. They complement each other: Core Skills provide baseline ADK knowledge, while the meta skill-creator generates domain-specific skills your team needs beyond what Google provides.</p>
<hr>
<h2 id="references" class="heading-anchor">References<a href="#references" class="anchor" aria-hidden="true" tabindex="-1">#</a></h2>
<ol>
<li><a href="https://google.github.io/adk-docs/skills/?utm_campaign=adk-agent-skills-part3&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>Skills for ADK Agents</a>
 — Official ADK documentation for SkillToolset and progressive disclosure</li>
<li><a href="https://agentskills.io/specification?utm_campaign=adk-agent-skills-part3&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>Agent Skills Specification</a>
 — The open standard defining SKILL.md format, adopted by 40+ agents</li>
<li><a href="https://agentskills.io/what-are-skills?utm_campaign=adk-agent-skills-part3&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>What Are Agent Skills?</a>
 — Conceptual overview of skills as reusable, agent-agnostic capabilities</li>
<li><a href="https://docs.cloud.google.com/agent-builder/agent-development-kit/overview?utm_campaign=adk-agent-skills-part3&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>ADK Overview (Vertex AI)</a>
 — Google Cloud documentation for Agent Development Kit</li>
<li><a href="https://github.com/google/adk-python/tree/main/src/google/adk/skills/models.py?utm_campaign=adk-agent-skills-part3&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
><code>skills/models.py</code></a>
 — <code>Skill</code>, <code>Frontmatter</code>, <code>Resources</code> class definitions</li>
<li><a href="https://github.com/google/adk-python/tree/main/src/google/adk/tools/skill_toolset.py?utm_campaign=adk-agent-skills-part3&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
><code>tools/skill_toolset.py</code></a>
 — <code>SkillToolset</code> implementation with auto-generated tools</li>
<li><a href="https://github.com/google/adk-python/tree/main/src/google/adk/skills/_utils.py?utm_campaign=adk-agent-skills-part3&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
><code>skills/_utils.py</code></a>
 — <code>load_skill_from_dir</code>, validation, SKILL.md parsing</li>
<li><a href="https://github.com/google/adk-python/tree/main/contributing/samples/skills_agent/?utm_campaign=adk-agent-skills-part3&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
><code>skills_agent</code> sample</a>
 — Official ADK sample with inline + file-based skills</li>
<li><a href="https://github.com/ComposioHQ/awesome-claude-skills" target="_blank" rel="noopener noreferrer"
>awesome-claude-skills</a>
 — 100+ production skills organized by domain</li>
<li><a href="https://github.com/ComposioHQ/awesome-claude-skills/blob/master/content-research-writer/SKILL.md" target="_blank" rel="noopener noreferrer"
>content-research-writer</a>
 — The external skill used in this tutorial</li>
<li><a href="https://github.com/obra/superpowers/blob/main/skills/writing-skills/SKILL.md" target="_blank" rel="noopener noreferrer"
>writing-skills (obra/superpowers)</a>
 — Meta skill-writing pattern that inspired Pattern 4</li>
<li><a href="https://github.com/miticojo/adk-skill" target="_blank" rel="noopener noreferrer"
>adk-skill (Giorgio Crivellari)</a>
 — Open-source ADK governance skill</li>
<li>Giorgio Crivellari — <a href="https://medium.com/google-cloud/i-built-an-agent-skill-for-googles-adk-here-s-why-your-coding-agent-needs-one-too-e5d3a56ef81b" target="_blank" rel="noopener noreferrer"
>I Built an Agent Skill for Google&rsquo;s ADK</a>
 — 245% quality improvement case study</li>
<li>Ravi Chaganti — <a href="https://ravichaganti.com/blog/google-adk-agent-skills/" target="_blank" rel="noopener noreferrer"
>Google ADK Agent Skills</a>
 — Practical walkthrough</li>
<li>Sid Bharath — <a href="https://sidbharath.com/blog/the-complete-guide-to-googles-agent-development-kit-adk/" target="_blank" rel="noopener noreferrer"
>The Complete Guide to Google&rsquo;s ADK</a>
</li>
<li>Spring AI — <a href="https://spring.io/blog/2026/01/13/spring-ai-generic-agent-skills/" target="_blank" rel="noopener noreferrer"
>Generic Agent Skills</a>
 — Java ecosystem adopting the spec</li>
<li><a href="https://x.com/antigravity/status/2028153290937061878" target="_blank" rel="noopener noreferrer"
>@antigravity — Intro to Agent Skills</a>
 — The video that sparked this build (85K views)</li>
<li><a href="https://x.com/liamottley_/status/2025863592462233830" target="_blank" rel="noopener noreferrer"
>@liamottley_ — &ldquo;SaaS is being replaced by SKILL.md files&rdquo;</a>
 — 562 reactions</li>
<li><a href="https://x.com/Pavan_Belagatti/status/2027396542815199643" target="_blank" rel="noopener noreferrer"
>@Pavan_Belagatti — MCP vs Skills</a>
 — Clear MCP/Skills differentiation</li>
<li><a href="https://x.com/dAAAb/status/2028666775001608334" target="_blank" rel="noopener noreferrer"
>@dAAAb — 15 Open-Source Agent Skills</a>
 — 40+ agents supporting agentskills.io</li>
<li><a href="https://x.com/alexalbert__/status/2001760879302553906" target="_blank" rel="noopener noreferrer"
>@alexalbert__ — Agent Skills as open standard</a>
</li>
<li><a href="https://google.github.io/adk-docs/tutorials/coding-with-ai/?utm_campaign=adk-agent-skills-part3&amp;utm_medium=blog&amp;utm_source=lavinigam-blog" target="_blank" rel="noopener noreferrer"
>ADK Core Skills</a>
 — official skills for building ADK agents</li>
</ol>




<a class="btn btn-primary" href="https://github.com/lavinigam-gcp/build-with-adk/tree/main/adk-agent-skills-tutorial" target="_blank" rel="noopener noreferrer">
  Clone the Repo &#x2197;
</a>

]]></content:encoded>
    </item>
  </channel>
</rss>
