Both are markdown that steers your agent — but they're used differently. A skill is on-demand expertise that loads when a task matches it. A rules file is an always-on set of project conventions the agent reads every time.
Most agents read a project-level conventions file on every request — .cursorrules / .cursor/rules/ (Cursor), AGENTS.md (Codex, Amp and others), .clinerules/ (Cline), .windsurf/rules/ (Windsurf), .goosehints (Goose). It's where you put standing facts: "this repo uses pnpm", "always write tests in Vitest", "our API base is …". It's loaded whether or not it's relevant to the current task.
A skill is a SKILL.md the agent loads only when the task matches its description — that's progressive disclosure. You can install dozens of skills (PDF handling, a specific API's conventions, a release checklist) without any of them weighing on unrelated work. The right one shows up exactly when it's needed.
A rule that only matters for 5% of tasks is wasted context the other 95% of the time — that's a skill. A skill you want active on every single request is really a rule.
On agents without a native skill loader, the two converge: you install a skill by dropping its body into the rules directory (see the install guide), so it behaves like an always-on rule. Native-loader agents keep the distinction sharp. Either way, the open SKILL.md format means the same content is portable — see which agents support skills and how each loads them.