Adding a post to this repository isn't a complicated procedure. And yet it kept getting re-explained:
By the third time, two things stand out. Something is always missing — and it's a different something each time.
The real cost isn't typing, it's consistency. Same task, different instructions, different results.
1. Deciding What Becomes a Skill
Not every repetition deserves one. Our tests:
- Have you done it three times? Twice is coincidence; three is a pattern.
- Does the procedure have an order? A single question is just a question.
- Is there a step that's easy to forget? This is the one that matters.
That third test carries the decision. A long procedure whose steps are all self-evident doesn't need a skill. A short one that includes "and you also have to do this" does.
Scoring the borderline cases
Two out of three tests pass more often than you'd like. This is the tiebreaker we use — the third test gets extra weight on purpose.
"Surfaces much later" is deliberate. A mistake that shows up immediately gets caught immediately. The expensive ones are omissions you find weeks out — like learning a month later that a missing redirect quietly broke an indexed URL.
What we actually froze in this repository:
The second is the clearest example. Creating a page is easy. But the sitemap list and the redirects have to change with it, and the build doesn't catch either. It gets forgotten every single time.
2. What Goes Inside a Skill
We started out treating skills as "a long prompt, saved." That didn't work. Now each one carries four things.
When to use it
The description is information for choosing. "Add a post" is worse than "add a blog post as a ko/en pair and verify it builds." Saying when not to use it helps more still.
Ordered steps
Number only what genuinely has an order. Numbering order-independent steps creates needless serialization.
The things that get forgotten
This is why the skill exists at all — the most important section.
Definition of done
What "finished" means. Here it's a passing npm run build plus a visual check on the things the build can't see.
All four in one file
Put together, that's the skeleton of the "add a post" skill we actually use:
That length is roughly the ceiling. Past it, what's usually crept in is material that belongs in the rules file.
3. Dividing Skills, Rules Files, and Build Guards
All three shape agent behavior, and where something belongs is genuinely easy to get wrong.
The dividing line is scope. "Post bodies are HTML" is true no matter what you're doing, so it belongs in the rules file. "When adding a post, do it in this order" only means something during that task, so it belongs in a skill.
And if a rule is mechanically checkable, it belongs in none of the three — it belongs in the build. That's why ko/en symmetry is a build guard rather than a step in the skill. A skill applies when invoked; a build guard applies even when the skill isn't.
Skills guide procedures that are easy to miss; they don't enforce invariants. Anything that must be enforced has to fire even when the skill is bypassed.
Deciding where a new rule goes
Answer these top to bottom and the location falls out. The order matters — higher means a stronger guarantee.
Plenty of entries in this repository failed at step 1 and still sat in the rules file: ko/en symmetry, link direction between posts, matching date across locales. All three only started holding once they moved into the build. For as long as they were prose, they kept drifting.
The "No" branch at step 3 comes up more than you'd expect — a skill that looked worth writing turns out to hold one obvious line. We deleted those.
4. Mistakes We Made
Skills that copy the rules file
At first we duplicated rules into the skills. Then a rule changed and the two copies disagreed — with no way to tell which was current.
Now skills only point: "front matter fields follow the table in CLAUDE.md." One rule, one place to change it.
Skills that are too large
A "manage the blog" skill ends up covering adding, editing, deleting, and reorganizing. Half of it is irrelevant on any given run, and it stops being clear when to invoke it. One task, one skill works better.
Baking decisions into the skill
Skills should carry how, not what. Put a list of topics inside an "add a post" skill and it stops being a skill — it's a plan. Plans belong somewhere else.
5. What We Deliberately Didn't Freeze
Some procedures repeat and still didn't become skills.
- One-off work. No reuse, no reason to freeze it.
- Work where the judgment changes each time. If it's a decision rather than a procedure, a skill gets in the way.
- Single-step work. Just say it.
The second one is subtle. "What should this post be about" recurs constantly, but the answer must differ every time. Freeze that into a skill and you get the same post repeatedly. Recurring and worth-freezing are not the same property.
When the Skill Exists and Still Gets Ignored
Sometimes a skill is written and simply doesn't take effect. It came down to four cases, each with its own symptom.
The first row is by far the most common. A description reading Add a post gives nothing to choose on, so however well the procedure is written, the file never opens. A skill's description isn't a summary of its contents — it's the invocation condition.
The third row is tangled up with repository layout. When the rules are scattered across several places, a skill can't even tell which one to point at. Settling where documents live first removes about half of this problem.
Frequently Asked Questions
How are skills different from slash commands?
In how they get invoked. A slash command is typed by a person; a skill opens on its own when its description matches the work. That makes the description the skill's entire interface. If a person will always start the task anyway, a command is enough. If the agent has to recognize the moment, it needs to be a skill.
How many skills should a repository have?
Overlap matters more than count. If two skills' names don't tell you which to reach for, you already have too many — whatever the number. This repository has three, and their subjects (posts, pages, batches) don't overlap, so choosing costs nothing.
What if a skill never gets invoked?
It's almost always the description. Check that it carries all three of subject (what), timing (when), and exclusion (when not to). If it still doesn't open, the task is probably one a person always initiates — in which case a command is the right shape.
Can a skill contain a script?
If it can, you're usually better off keeping the script and deleting the skill. A fully automated procedure isn't a procedure; it's one command. Skills earn their keep when judgment is interleaved between the steps.
If we have a rules file, why bother with skills?
Scope. A rules file always applies — but always applying also means always being read, occupying context during unrelated work. Put a 20-line procedure needed by one task into the rules file and every other task pays for it. A skill defers that cost to the moment it's needed.
What if the skill keeps changing?
A skill that changes constantly usually has a plan mixed into it. Procedures are stable; plans change every run. Here, everything that varies per batch moved into the scheduled-publishing queue file, leaving the skill with one instruction: read the queue and start from the first unfinished item. We haven't had to edit it since.
6. In Summary
What skills bought us wasn't saved time — it was consistency. The same task now runs in the same order through the same checks.
- Writing the same explanation a third time is the signal.
- Freeze only procedures with forgettable steps. Self-evident ones don't need a skill.
- Rules in the rules file, procedures in skills, checkable things in the build.
- Skills point at rules instead of copying them. Copies drift.
- Carry how, not what. Decisions belong in the plan.
If you keep re-explaining the same work, write that explanation carefully once and put it in the repository. What you stop losing isn't keystrokes — it's the results that came out slightly different every time.