Skill Routing
The orchestrator skill (/rails-cto) is the traffic cop for the whole plugin. When you invoke it at the start of a session, it loads the core Rails engineering context and then watches for signals that should activate specialized skills.
How routing works
Every skill in the plugin has a description field in its SKILL.md frontmatter. The description lists the file types the skill cares about, the keywords it responds to, and the situations where it should fire.
When your agent reads those descriptions at the start of a session, it builds an internal map of "if the user says X or I touch Y, invoke skill Z." That map is what makes the routing automatic — you don't have to type /rails-cto-qa yourself after editing a Ruby file. The orchestrator already knows to call it.
The mandatory routes
Three routes are mandatory. They are enforced both by the skill descriptions and by the CLAUDE.md block that rails-cto init installs:
| When | Skill that fires |
|---|---|
Any .rb file is created or modified | rails-cto-qa |
Any .html.erb file is created or modified | rails-cto-erb + rails-cto-tailwind |
| Any implementation plan is drafted | rails-cto-qa (as the final step) |
These can't be skipped. The orchestrator treats them as hard gates — if a task would otherwise finish without them running, the gate fires.
The proactive routes
Other skills fire based on the file path or the user's language:
| When | Skill that fires |
|---|---|
Touching app/controllers/api/** or mentioning "endpoint", "serializer", "openapi" | rails-cto-api |
| Touching any controller, route, or mentioning "REST", "CRUD", "nested resource" | rails-cto-restful |
| Touching any Stimulus controller or mentioning "data-controller", "targets", "values" | rails-cto-stimulus |
| Writing or fixing tests, or mentioning "minitest", "spec", "coverage" | rails-cto-minitest |
Touching app/components/** or mentioning "ViewComponent", "preview", "Lookbook" | rails-cto-view-component |
Modifying any .rb file (runs alongside QA) | rails-cto-static-analysis |
Modifying any .rb or .html.erb file (runs alongside QA) | rails-cto-security |
Git workflow routes
Git-workflow skills are user-invoked, not file-triggered. You can call them explicitly with a slash command or by saying the thing:
| When you say | Skill that fires |
|---|---|
"commit this", "save my progress", "ship it", /commit-all | rails-cto-commit |
"open a PR", "create a pull request", /pr, /pull-request | rails-cto-pull-request |
"release to production", "deploy this", /production-pr | rails-cto-production-pr |
Overriding routing
If a skill keeps firing when you don't want it to, you have three options:
- Be more specific in your request. A lot of over-firing happens because the agent picks up a keyword. If you say "I just want a rough sketch of the controller, don't worry about tests yet," the orchestrator won't enforce the gate.
- Edit the
CLAUDE.mdblock to remove the mandatory rule for a specific skill. See CLAUDE.md Wiring. - Open an issue at the plugin's GitHub repo if the routing logic feels wrong — the skill descriptions can be tightened.