<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title>Ju Lin's AI Weblog: Fine-Tuning</title><subtitle>An independent research notebook on AI engineering, agents, models and the systems around them.</subtitle><id>https://julin.ai/atom/tags/fine-tuning/index.xml</id><link rel="self" type="application/atom+xml" href="https://julin.ai/atom/tags/fine-tuning/index.xml"/><link rel="alternate" type="text/html" href="https://julin.ai/tags/fine-tuning/"/><author><name>Ju Lin</name></author><updated>2026-08-27T00:00:00+12:00</updated><entry><title>Agent Skills</title><id>https://julin.ai/2026/08/27/agent-skills/</id><link rel="alternate" type="text/html" href="https://julin.ai/2026/08/27/agent-skills/"/><published>2026-08-27T00:00:00+12:00</published><updated>2026-08-27T00:00:00+12:00</updated><category term="explainer"/><category term="agents"/><category term="skills"/><category term="pi"/><category term="hermes"/><category term="openclaw"/><category term="fine-tuning"/><category term="field-notes"/><content type="html">&lt;p&gt;Agent skills let humans organize, distribute, discover, and compose an agent&amp;rsquo;s capabilities. A skill is typically a markdown file, with optional scripts, references, and evals bundled alongside it.&lt;/p&gt;
&lt;p&gt;Think of an agent skill as programming in natural language, written in markdown. It can hold knowledge, workflow logic, guardrails, required tools — basically anything.&lt;/p&gt;
&lt;p&gt;Some outstanding skills:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/karpathy/autoresearch"&gt;autoresearch&lt;/a&gt; instructs an agent to tirelessly tune models. It defines a workflow — really a loop — and states plainly what the agent can edit and what it can&amp;rsquo;t.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/img2threejs/img2threejs"&gt;img2threejs&lt;/a&gt; turns an image into a 3D model. It defines a workflow with heavy guardrails at every stage.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/obra/superpowers"&gt;superpowers&lt;/a&gt; defines a software development lifecycle. It has an opinionated, mandatory way to deliver software.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You probably already do some of this by hand. Just write it down, name the file &lt;code&gt;SKILL.md&lt;/code&gt;, and let the agent pick it up. It&amp;rsquo;s that simple.&lt;/p&gt;
&lt;h3 id="life-cycle"&gt;Life cycle&lt;/h3&gt;
&lt;p&gt;A skill moves through six stages: &lt;strong&gt;Discovered, Selected, Loaded, Executed, Unloaded, Self-Improved.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="/2026/08/27/agent-skills/diagram-lifecycle.svg" alt="Six stages in a row: discovered, selected, loaded, executed, unloaded, and self-improved."&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Discovered&lt;/strong&gt; — the harness reads the skill&amp;rsquo;s name and description at startup.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Selected&lt;/strong&gt; — the model decides a task matches the skill.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Loaded&lt;/strong&gt; — the harness loads the full &lt;code&gt;SKILL.md&lt;/code&gt; into context.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Executed&lt;/strong&gt; — the model follows the instructions and calls whatever tools the skill needs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unloaded&lt;/strong&gt; — the task is done, and the skill drops back out of context. This may not be implemented in all AI agents.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Self-improved&lt;/strong&gt; — the agent rewrites its own skill from experience, instead of waiting for a human to update the file. This often shows up in auto-enhancing agents like &lt;a href="https://clawhub.ai/pskoett/self-improving-agent"&gt;Open Claw&lt;/a&gt; and &lt;a href="https://github.com/NousResearch/hermes-agent"&gt;Hermes&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="case-study-pi"&gt;Case study: Pi&lt;/h3&gt;
&lt;p&gt;Pi calls this &lt;strong&gt;progressive disclosure&lt;/strong&gt;. At startup it scans every skill directory but only puts each skill&amp;rsquo;s name and description into the system prompt. If the model decides a skill is relevant, it uses the normal read tool to load that skill&amp;rsquo;s &lt;code&gt;SKILL.md&lt;/code&gt;, then follows the instructions and invokes whatever existing tools or scripts are appropriate.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://pi.dev/docs/latest/skills"&gt;Pi&amp;rsquo;s own docs&lt;/a&gt; admit the model doesn&amp;rsquo;t always make that call on its own — sometimes you have to prompt it, or name the skill directly, to force the read.&lt;/p&gt;
&lt;h3 id="case-study-hermes"&gt;Case study: Hermes&lt;/h3&gt;
&lt;p&gt;Hermes uses a similar &lt;strong&gt;progressive disclosure&lt;/strong&gt; idea, but makes skill discovery more explicit. Instead of relying on the model to notice a skill description in the system prompt and then &lt;code&gt;read&lt;/code&gt; its file, &lt;a href="https://hermes-agent.nousresearch.com/docs/user-guide/features/skills"&gt;Hermes exposes skills through dedicated tools&lt;/a&gt;: &lt;code&gt;skills_list()&lt;/code&gt; gives the agent a compact index of installed skills, &lt;code&gt;skill_view(name)&lt;/code&gt; loads the full &lt;code&gt;SKILL.md&lt;/code&gt;, and &lt;code&gt;skill_view(name, path)&lt;/code&gt; can pull in individual reference files. The full procedure only enters context when the agent decides it needs it, keeping the initial prompt relatively small.&lt;/p&gt;
&lt;p&gt;Hermes also gives the user a stronger escape hatch when automatic routing fails. Every installed skill becomes a slash command — &lt;code&gt;/plan&lt;/code&gt;, &lt;code&gt;/github-pr-workflow&lt;/code&gt;, and so on — which directly loads that skill instead of hoping the model selects it from natural language. You can still say &amp;ldquo;use the X skill&amp;rdquo; conversationally, but Hermes treats explicit skill invocation as a first-class interaction rather than a workaround.&lt;/p&gt;
&lt;h3 id="write-practical-skills"&gt;Write practical skills&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;KISS.&lt;/strong&gt; &lt;a href="https://github.com/anthropics/claude-plugins-community/blob/main/eli5/skills/eli5/SKILL.md"&gt;eli5&lt;/a&gt; is a good example — ten lines, and it works.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Do one thing and do it well.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Write a worklog.&lt;/strong&gt; Like in the superpowers skill, have the agent write an exec plan before doing any work.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Keep the loop simple.&lt;/strong&gt; Don&amp;rsquo;t over-engineer the control flow — the LLM handles that quite well on its own. Just give it &lt;strong&gt;enough&lt;/strong&gt; knowledge so it can get things done.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ask for input.&lt;/strong&gt; The skill can tell the agent to ask the user for clarification.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Be robust.&lt;/strong&gt; The skill should describe how to deal with errors — if it can&amp;rsquo;t recover, should it stop, or escalate to a human?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Write a structured description.&lt;/strong&gt; Name, capabilities, required tools, input/output schema.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use Git for version control.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Explicitly state dependencies.&lt;/strong&gt; Whether it&amp;rsquo;s a system tool, a library, an API key, an MCP server, or even another skill.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Come with an &lt;code&gt;evals/evals.json&lt;/code&gt;.&lt;/strong&gt; So you can tell whether a change to the skill made it better or worse.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id="extra-guides-for-scripts"&gt;Extra guides for scripts&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Make the script standalone.&lt;/strong&gt; If it has dependencies, run it through tools like &lt;code&gt;uvx&lt;/code&gt; or &lt;code&gt;npx&lt;/code&gt;, so skill users don&amp;rsquo;t need to set up an environment.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Provide options and arguments, and avoid interactive prompts.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="should-i-fine-tune-or-just-write-a-skillmd"&gt;Should I fine-tune or just write a SKILL.md?&lt;/h3&gt;
&lt;p&gt;A skill is instant. It doesn&amp;rsquo;t involve costly training, and you can swap it on the fly — you can even ask the agent to re-read the skill to pick up a change mid-run. Maintenance is cheap; there&amp;rsquo;s no &amp;ldquo;retrain&amp;rdquo; step.&lt;/p&gt;
&lt;p&gt;It also has great flexibility. Same model, same agent loop, different skills loaded — and you get different results. That&amp;rsquo;s great for user customization.&lt;/p&gt;
&lt;p&gt;The downside is context window. Skills consume it, and if you have a lot of large skills, they can overfill it.&lt;/p&gt;
&lt;p&gt;Usually, when you need instruction following, tool call format, or RL reasoning baked in, fine-tuning is the better choice. A skill is a runtime add-on for executing tasks.&lt;/p&gt;
&lt;h3 id="further-reading"&gt;Further reading&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/anthropics/skills"&gt;anthropics/skills&lt;/a&gt; — Anthropic&amp;rsquo;s example skills, and the origin of the &lt;code&gt;SKILL.md&lt;/code&gt; format&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pi.dev/docs/latest/skills"&gt;Pi skills docs&lt;/a&gt; — how Pi&amp;rsquo;s progressive disclosure works in practice&lt;/li&gt;
&lt;li&gt;&lt;a href="https://agentskills.io/home"&gt;agentskills.io&lt;/a&gt; — the open Agent Skills spec, plus a directory of clients that support it&lt;/li&gt;
&lt;/ul&gt;</content></entry></feed>