docs/capability-surface-selection.md
Use this as the routing guide when deciding whether a capability belongs in a rule, a skill, an MCP server, or a plain CLI/API workflow.
ECC does not treat these surfaces as interchangeable. The goal is to put each capability in the narrowest surface that preserves correctness, keeps token cost under control, and does not create unnecessary runtime or supply-chain drag.
rules/ are for deterministic, always-on constraints that should be injected when a path or event matches.skills/ are for on-demand workflows, richer playbooks, and token-expensive guidance that should load only when relevant.MCP is for interactive structured capabilities that benefit from a long-lived tool/resource surface across sessions or clients.CLI or repo scripts are for simple deterministic actions that do not need a persistent server.API calls inside a skill are for narrow remote actions where a full MCP server would be heavier than the problem.Ask these questions in order:
rule.skill.MCP.CLI entrypoint or repo script, then wrap it with a skill if needed.API directly from the skill or script.Use rules for:
Do not use rules for:
Use skills for:
Do not use skills as a dumping ground for static invariants that really want deterministic routing.
Use MCP when the capability benefits from:
Avoid MCP when:
Prefer a local script or CLI when:
This is often the right choice for:
Prefer direct API calls inside an existing skill or script when:
If the same remote integration becomes central, repeated, and multi-client, that is the signal to graduate it into an MCP surface.
When two options are both viable:
Do not normalize external plugin or package dependencies as first-class ECC surfaces unless the capability is clearly worth the maintenance, security, and install burden.
When bringing in ideas from external repos:
api/** edits:
ruleskillMCPCLI or script, optionally wrapped by a skillAPI call inside the workflowIf you are unsure, start smaller:
rule for deterministic invariantsskill for guidance/workflowMCP only when the structured server boundary is clearly paying for itself