“I decide by what the capability is, not by what I want it to do. If it’s knowledge or a procedure — a convention, a checklist, a runbook — it’s a skill: only its description sits in context until the model needs it, and the main model already has the material to apply it to.
If the work needs a clean window or a narrower toolset, like a security review or a deep search, it’s a subagent: it reads in its own context and hands back a summary. If it’s access to a system outside the session that more than one host or team will use, it’s an MCP server, so auth and pagination are written once. And if it’s one action in my own loop that my harness has to see — a refund, a deploy — it’s a dedicated tool with typed arguments I can gate.
The smells are when they overlap: a curl template with an auth header inside a skill is an MCP server waiting to be written, and pages of ‘how we do X’ in a subagent prompt is a skill it should preload.
And if something has to happen every time, none of the four — that’s a hook.”