← Back to Blog
pullmdclaude-codeskillsevaluationApril 12, 2026 · 4 min read

PullMD Part 4: The Skill, and What It Actually Delivers – Simply Explained

SKILL → PULLMD · FALLBACK → .INVALID · RFC 2606AI-generated image
Editorial diagram: on the left a densely packed web page, in the middle a copper-framed gate labelled SKILL with a pointer choosing the route. Above it, PULLMD leads to a complete table with line numbers; below it, FALLBACK runs through a funnel to a thinned-out card. At the bottom a panel labelled TRACE with two failed attempts and the result .INVALID, RFC 2606.Editorial diagram: on the left a densely packed web page, in the middle a copper-framed gate labelled SKILL with a pointer choosing the route. Above it, PULLMD leads to a complete table with line numbers; below it, FALLBACK runs through a funnel to a thinned-out card. At the bottom a panel labelled TRACE with two failed attempts and the result .INVALID, RFC 2606.

The service was up and running. I could call it from the command line and it did what it was supposed to. That wasn’t the point, though. The point was getting Claude Code to call it on its own, without me saying “use that tool” every single time.

That’s what skills are for. And because I’m never quite sure with this sort of thing whether it really changes anything or whether I’m only imagining it, we measured it.

What a Skill Actually Is

First, a couple of terms that come up a lot here.

An agent is the AI assistant that acts on your behalf. You tell it what you want, and it decides which steps to take and which tools to use. Claude Code is that kind of agent.

A skill isn’t a tool. It can’t do anything the agent couldn’t already do. Think of it as a short note pinned to the agent’s desk. It says things like: “When someone asks you to read a web page, take this particular service and not the built-in one. Except for GitHub pages, there you take the command-line tool called gh. And if the service doesn’t answer, fall back to the built-in tool instead of giving up.”

The built-in tool is called WebFetch. It fetches web pages too, but it works differently. More on that in a moment.

That’s the difference between “the tool exists” and “the tool gets used in the right place”. Without the skill, the agent has several tools and picks whichever seems right. With the skill, it has a clear recommendation.

Back then the skill was still called web-reader. The name the project runs under today didn’t exist yet.

Three Tasks, Run Twice

So the question was simple: does that note on the desk make any difference?

Claude wrote down three tasks and ran each of them twice. Once with the skill, once without. The answers still sit side by side in the project today, along with a note on which route was taken each time.

The three tasks:

  1. Read a Wikipedia article and summarise it in three sentences
  2. Fetch the front page of Hacker News (a popular tech news site) and name the top five titles
  3. Fetch a web address that doesn’t exist at all

The third one was the real test. The first two were there to show whether anything happens in the normal, everyday case.

The Result

With the Wikipedia summary there was practically no difference. Both versions are correct, both roughly the same length, both name John Gruber and the year 2004. Put them side by side and you see two usable answers.

Hacker News got more interesting. Without the skill, five titles came back. With the skill, the same five titles plus scores and comment counts:

1. **Motorola GrapheneOS devices will be bootloader unlockable/relockable**
   (773 points, 249 comments)
2. **RFC 9849. TLS Encrypted Client Hello** (93 points, 42 comments)

Why? Not because the skill is smarter. Because through PullMD the whole page arrives as markdown (a simple text format, text with structure but without the clutter) and the model can take what it needs. With WebFetch, a different model has already decided beforehand what’s important and dropped the rest.

And with the address that doesn’t exist, the difference became obvious. Without the skill:

Error message: unable to verify the first certificate

That’s simply misleading. The domain (the web address) doesn’t exist at all, and certificates have nothing to do with it.

With the skill, the answer said that the .invalid suffix is deliberately never resolvable under RFC 2606 (a technical standard that reserves a few address endings so they can never exist for real). Plus the chain of attempts: PullMD first, then WebFetch, both failed, and why.

What Happens Inside WebFetch

We weren’t that clear on this back in April. It does explain, though, why the results came out so differently.

When WebFetch fetches a page, the raw page doesn’t go to the agent that asked for it. It goes into a second, separate conversation with a smaller model first. That smaller model gets a fixed instruction: keep the answer short, quotes at most 125 characters. All that comes back is that summary. The agent never gets to see the page itself.

With a summary you don’t notice, because summarising is what happens anyway. With numbers you notice. And with errors you really notice, because the intermediate step invents a plausible explanation where an implausible one would have been correct.

What That Means

The gain isn’t big. It’s structural. PullMD returns word for word what’s on the page. WebFetch returns only what’s left of it.

I’d have liked a clearer result. “Three times as good with the skill” would have been a nice number. That’s not how it was, and looking back I think it’s rather good that I wrote it down instead of just telling the story.

At the end of April, by the way, someone on Reddit explained the same thing to me from the other side, without knowing the skill at all. That’s in Part 9.


Part 4 of 15 in the PullMD series.

← PullMD Part 3: The API, and How Reddit Became Any URL | PullMD Part 5: Measuring the Wrong Engine →

Comments

Commenting takes an email confirmation or a GitHub login. Comments run on my own server, not on an ad provider's — details in the privacy policy.