Claude reads each SKILL.md description and tries to match it against your message. In theory, the right skill loads when the context fits. In practice, it misses.
The description field is soft matching — Claude treats it as a hint, not a rule. If you want a skill to fire at a specific moment, you have two options that actually work.
Option 1: slash command directly. Type /skill-name and it runs.
Option 2: CLAUDE.md trigger rule. Add an explicit line like:
When the user says "commit", invoke the smart-commit skill.
When implementation is complete, invoke the code-review skill. This is how skills with side effects — deploys, commits, messages — should be controlled anyway. The disable-model-invocation: true flag is there for the same reason: to stop unintended auto-firing.
If your skill isn’t triggering when you expect it to, the description isn’t the problem. The trigger setup is.