<?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>Design-Patterns on Lavi Nigam</title>
    <link>https://lavinigam.com/tags/design-patterns/</link>
    <description>Recent content in Design-Patterns 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/design-patterns/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>
  </channel>
</rss>
