The Instructions vs Skills Distinction: Governance vs Execution
When I look at repos that manage agents and skills, I keep noticing the same pattern: governance rules do not stay in the instruction layer. They get pushed down into skills. A repo starts with a clean distinction in theory, then practical pressure takes over. It feels easier to tuck a rule into the skill that already handles PRs, releases, reviews, or docs updates than to keep the governance layer separate and durable.
That leak creates a mess fast. Policy gets buried inside execution, contributors have to hunt through step-by-step workflow files to figure out what is actually required, CI can only enforce the rules that escaped into the right place, and every workflow tweak risks rewriting what should have been a stable repo expectation. The instructions-versus-skills distinction only matters if you keep the layers separate. Once rules get pushed into skills, you lose both layers.
So I kept pulling on one simple question: when does guidance belong in repo instructions, and when does it belong in a skill?
Build the mental model
The cleanest model I found is this: instructions constrain behavior; skills produce behavior.
Repo instructions are the guardrails that shape every interaction. They are ambient. They sit in the background like shop rules posted above the bench: use this style, follow this architecture, require these approvals, don't skip these checks. They tell Copilot what "good" looks like before any specific task begins.
Skills are different. They are invoked capabilities. A skill is more like picking up a jig, checklist, or specialty tool when the work calls for it. It exists to do something repeatable: create a PR, summarize CI failures, triage issues, draft release notes, or run a multi-step review.
My perspective: if instructions are the Cascades in the distance — fixed, always shaping the weather — skills are the trails you choose for today's hike. Both matter. They just solve different problems.
| Layer | Question it answers | Behavior model | Best for |
|---|---|---|---|
| Repo instructions | "How do we operate in this repo?" | Passive, always-on | Rules, conventions, expected outcomes |
| Skills | "What reusable thing should happen now?" | Active, invoked when relevant | Workflows, procedures, tool-backed execution |
Use a decision framework instead of guessing
The practical test is boring, and boring is good. Before I place any Copilot guidance, I ask four questions:
- Should this apply all the time? If yes, it leans toward instructions.
- Does it read like a rule or expectation? If yes, it belongs in instructions.
- Does it require ordered steps, tools, or output generation? If yes, it belongs in a skill.
- Would I ever want to call this only on demand? If yes, it probably belongs in a skill.
The questions sound cleaner than real repos feel, so I keep a few messy cases around to pressure-test them.
Test the messy cases
- A PR template with required sections plus a note like "if this is a hotfix, add the emergency label" is mixed. The required sections are instruction material. The branching label logic belongs in a skill or automation.
- A linter config that sets repo rules but also shells out to custom validation is mixed too. The rules stay in config. The shell step is execution, so I want that script or skill to stand on its own.
- A docs checklist that says "update screenshots when UI changes" looks simple until the exceptions show up. The durable expectation belongs in instructions. The conditional screenshot workflow is skill territory.
None of that is perfectly tidy. Sometimes the first draft is a mixed artifact and the framework only tells me where to cut it apart. That's still useful. I don't need a universal law. I need a way to stop hiding rules inside procedures just because they showed up in the same file first.
Put durable rules in repo instructions
Repo instructions should hold the durable governance layer: coding standards, architectural boundaries, PR naming conventions, review expectations, security constraints, documentation requirements, and the definition of done.
A PR guidance block usually looks more like this:
# .github/copilot-instructions.md
## Pull Request Guidelines
- Use format: [area]: short description
- Include: summary, testing notes, and docs impact
- Request review from CODEOWNERS
- Do not suggest merging until CI passes
- Use the pr-lifecycle skill when creating or updating pull requests
This works because the file describes expectations, not choreography. It doesn't try to walk Copilot through twenty steps. It tells the agent what standards must be true whenever PR work comes up.
Good instruction content usually has these traits:
- It is always applicable or path-scoped in a predictable way.
- It describes outcomes, not button clicks.
- It stays stable even if tooling changes.
- It is short enough to remain readable and enforceable.
If I change GitHub templates, CI jobs, or branch automation later, the governance may stay the same. That's the signal that the content belongs in instructions.
Put executable workflows in skills
Skills should own the operational layer. If something needs steps, tools, branching logic, templates, or generated artifacts, I move it into a skill.
At repo level, it usually looks more like this:
.copilot/skills/pr-lifecycle/
├── SKILL.md
├── templates/pr-description.md
└── scripts/check-pr-readiness.sh
Inside the skill, I keep the file focused on execution:
# PR Lifecycle Manager
## When to use
- Creating a new pull request
- Updating a pull request after review
- Checking whether a pull request is ready to merge
## Capabilities
- Draft PR title and description from git diff
- Validate required sections and linked work items
- Summarize failing CI checks
- Prepare merge notes or release notes
That belongs in a skill because it executes actions on behalf of the user. It may call tooling. It may collect context. It may follow a sequence. None of that is reliably enforced by passive instructions alone.
A good skill is procedural without being bloated. It should tell the agent when to use it, what inputs it needs, what outputs it should create, and where deeper references live. That's the same pattern I keep coming back to in Copilot repos: instructions define the lane; skills drive the truck.