No-ops in Your Skills: The Instructions That Look Impressive but Do Nothing
Open any agent skill file and search for lines like these:
- “Make the commit message very detailed”
- “Be thorough”
- “Make the implementation easy to read”
What do these lines have in common?
They’re no-ops—they look like they’re handing out instructions, but they have zero effect on the model’s behavior. An agent already writes good commit messages, already tries to be thorough, already tries to keep the implementation readable. These are its defaults; you don’t need a line to ask for them.
Mogu highlights:
Bit of trivia: no-op is short for
no-operation, borrowed from theNOPinstruction in assembly — the CPU hits it, burns one cycle, and does nothing, used purely for timing or memory alignment. So asking whether a prompt line is a no-op is the same question: does it actually operate on anything, or is it just a placeholder spinning in place? w(゚Д゚)w
The test is simple: delete the line, run it once, and check whether the output changes. It didn’t? Then that line was pure decoration.
Mogu chimes in:
It’s like the “Please answer seriously” printed on an exam—has anyone ever read that and flipped from “I was going to wing it” to “okay, fine, I’ll focus”? Same with the model: it was already trying. ┐( ̄ヘ ̄)┌
How to tell a “dead instruction” from a useful one at a glance
The two look almost identical, but the difference is actually clear—the key question is: would the model do this even if you never told it?
Delete these and nothing changes (no-ops):
- “Write maintainable, readable code”
- “Consider edge cases”
- “Be accurate”
Delete these and the behavior changes (useful):
- “This repo uses named exports only—no default exports”
- “Put tests in
__tests__/, run them withvitest” - “Prefix commits with a task ID, e.g.
[GU-123]”
See it? A no-op asks for the generic virtues the model “already tries for”; a useful instruction hands it the specific facts it “can’t guess”—this repo’s conventions, the toolchain in use, the format you want. The former is filler; the latter is the one place it genuinely needs someone to spell things out.
Agent-generated skills are the worst offenders
When you have an agent generate a skill, it stuffs in piles of “sounds professional, does nothing” paragraphs—whole sections of pure decoration. These dead instructions carry three real costs:
- Hard to evaluate: you can’t tell which instructions actually shape behavior and which are just ornament
- Hard to maintain: when you go to change something, you don’t know which lines are safe to delete and which will break if you do
- Wasted tokens: every run burns tokens feeding the model a pile of useless text
Further reading
- SP-237: Driving an Agent Like a Steam Locomotive — Coding-Agent Tactics for Large Projects
- SP-195: Skills Don’t Sell Because the Pricing Sits in the Wrong Place, Not Because They Lack Value
- SP-186: The OpenClaw Automation Landscape — Task Flow Is the Orchestration Layer for Multi-Step Work
Mogu highlights:
The funniest part is that this advice applies to itself: if a skill rule would be followed by any halfway-decent agent anyway, then it isn’t doing any work. Writing a prompt is like writing code—the lines that don’t do anything are dead weight to clear out. Next time your fingers itch to add one more line, ask first: what happens if I delete this? (◍•ᴗ•◍)
Mogu real talk:
Writing this gave gu-log itchy fingers, so we actually built a
/trimskill: a pack of subagents that runs this post’s exact no-op test line by line over our own skills, hunting the lines any half-decent agent would follow anyway. The first run dug ~400 tokens of pure decoration out of one of our own skills. Roasting yourself with your own article — peak gu-log. (¬‿¬)
ShroomDog murmur:
Here’s the funnier part: the first version of that /trim skill committed the exact sin it hunts. It hard-coded the entire reviewer brief for the sub-agent straight into the skill file—so every time the main agent loaded the skill, it swallowed that whole “prompt meant for someone else” into its own
context. A no-op hunter with a no-op growing on the blade.The fix is boring: move the brief into its own file and have the main agent pass only a path, so the sub-agent reads it directly. The main agent now holds two paths—where the target is, where the brief is—and not one word of the prompt enters its context.
openinteractive pageInline the whole brief into the main agent, or just pass a path?open the interactive pageA prompt is written for the agent that will run it, not the one forwarding it. If you can hand it over as a path, don’t haul it through context.