Створення Skills
Покрокова інструкція з додавання нової експертизи до твого Arc OS проєкту.
Що таке Skill
Skill — це портативний набір інструкцій, який навчає твого AI-бота конкретної здібності. Skills живуть у директорії skills/ і складаються з:
skill.md— файл інструкцій (обов'язковий)<name>.evals.json— правила автоматичної валідації якості (опціональний, але рекомендований)references/— допоміжні документи, схеми, приклади (опціональний)
skills/
├── _registry.json ← Центральний реєстр
├── my-new-skill/
│ ├── skill.md ← Що має робити AI
│ ├── my-new-skill.evals.json ← Як валідувати вивід
│ └── references/ ← Контекстні документи
└── library/
└── domain-expert.md ← Прості однофайлові skills
Крок 1: Напиши skill.md
Це основна інструкція. Claude читає її, коли skill активується.
Шаблон
# Skill Name
## Purpose
What this skill accomplishes in one sentence.
## When to Use
- Trigger condition 1
- Trigger condition 2
## Protocol
1. First action
2. Second action
3. Third action
## Output Format
What the response should look like.
## Constraints
- What NOT to do
- Safety boundaries
Рекомендації
- Менше 500 слів — довші skills розмивають контекст
- Наказовий спосіб — "Перевір репозиторій", а не "Тобі слід перевірити"
- Конкретні приклади — показуй очікувані пари вхід/вихід
- Конкретні посилання на інструменти — називай команди, API чи патерни для використання
Приклад: Odoo Expert
# Odoo Expert
## Purpose
Odoo ERP module development: models, views, security, QWeb templates.
## When to Use
- Building or modifying Odoo modules
- Writing QWeb templates
- Configuring access rules and record rules
- Working with the ORM (create, write, search, browse)
## Protocol
1. Check if modifying an existing module or creating new
2. Follow Odoo 17 conventions (manifest, models/, views/, security/)
3. Use self.env['model.name'] for ORM operations
4. Always use _t() or t-call for translatable strings
5. Test with --test-tags after changes
## Constraints
- Never use cr.execute() for direct SQL — use ORM
- Never use sudo() unless security context explicitly requires it
- No inline JavaScript in QWeb templates
Крок 2: Напиши evals (Правила якості)
Evals — це декларативні правила, які автоматично валідують кожну відповідь. Вони запускаються після того, як Claude згенерував вивід, і додають попереджувальні виноски, якщо правила не виконано.
Іменування файлу
skills/<name>/<name>.evals.json
Схема
{
"version": 1,
"skill": "my-new-skill",
"rules": [
{
"id": "ms-001",
"name": "Human-readable rule description",
"type": "rule_type",
"value": "for string/length types",
"pattern": "for regex types",
"severity": "warning"
}
]
}
Доступні типи правил
| Тип | Що перевіряє | Використовує поле |
|---|---|---|
string_contains |
Відповідь містить літеральний текст | value (string) |
string_not_contains |
Відповідь НЕ містить тексту | value (string) |
regex_match |
Відповідь відповідає regex | pattern (string) |
regex_not_match |
Відповідь НЕ відповідає regex | pattern (string) |
max_length |
Довжина відповіді <= N символів | value (number) |
min_length |
Довжина відповіді >= N символів | value (number) |
Рівні серйозності
warning— Вказує на проблему якості. Показується як⚠️.info— Інформаційна примітка. Показується якℹ️.
Приклад
{
"version": 1,
"skill": "odoo-expert",
"rules": [
{
"id": "oe-001",
"name": "Must use ORM, not raw SQL",
"type": "string_not_contains",
"value": "cr.execute",
"severity": "warning"
},
{
"id": "oe-002",
"name": "Must use translation helpers",
"type": "regex_match",
"pattern": "_t\\(|t-call|t-esc",
"severity": "warning"
},
{
"id": "oe-003",
"name": "Response under 5000 chars",
"type": "max_length",
"value": 5000,
"severity": "info"
}
]
}
Поради
- Починай з 2–3 правил. Додавай більше, коли виявлятимеш патерни з коректувань.
- Безпека насамперед:
string_not_containsдля небезпечних команд,regex_not_matchдля патернів облікових даних. - Конвенція ID:
<skill-prefix>-<number>(наприклад,oe-001,gm-002). - Тестуй: Надішли повідомлення, яке має спрацювати на skill, перевір, чи правильно з'являються попередження.
Крок 3: Зареєструй у _registry.json
Реєстр повідомляє Context Router про твій skill, щоб його можна було рекомендувати для релевантних повідомлень.
Додай запис
{
"name": "my-new-skill",
"description": "One sentence (shown in SKILLS_HINT, max 80 chars).",
"triggers": ["direct-command", "explicit-request", "пряма команда"],
"keywords": ["broader", "semantic", "related-term"],
"agents": ["rick"],
"category": ["complex"],
"phase": "21.5"
}
Triggers vs Keywords
Triggers (по 2 бали кожен): Сигнали прямого виклику. Користувач явно хоче цей skill.
- "deploy", "review", "scaffold", "odoo", "audit"
Keywords (по 1 балу кожен): Ширші терміни, які натякають на релевантність, але не є командами.
- "OWASP", "Docker", "CI/CD", "production", "module"
Рекомендації
- Додавай українські відповідники в triggers для двомовних команд
- Описи мають бути коротшими за 80 символів (обрізаються в SKILLS_HINT)
- 5–8 triggers на skill (більше = шумне зіставлення)
- Keywords опціональні, але значно покращують маршрутизацію
Крок 4: Library Skills (Простий формат)
Для доменної експертизи, яка не потребує evals чи окремої директорії, використовуй skills/library/:
skills/library/
├── docker-ops.md
├── postgres-pro.md
└── react-patterns.md
Це одиничні .md файли. Без директорії, без evals, без references. Підходить для skills, орієнтованих на знання, з мінімальною валідацією.
Чекліст
-
skills/<name>/skill.md— інструкція з Purpose, Protocol, Constraints -
skills/<name>/<name>.evals.json— щонайменше 2 правила валідації - Запис у
skills/_registry.json— з triggers і keywords - Назва збігається всюди — ім'я директорії = ім'я skill в evals = ім'я в реєстрі
- Тест: надішли trigger-повідомлення → переконайся, що SKILLS_HINT з'явився в логах
- Тест: навмисно зламай eval → переконайся, що з'являється попередження
Що відбувається під час виконання
1. Bot starts → loadRegistry() reads _registry.json
loadEvals() reads all .evals.json files
loadLearnings() reads learnings.md
2. Message arrives → routeContext() scores skills → SKILLS_HINT injected
formatForPrompt() adds LEARNINGS block
3. Claude responds → checkOutput() runs eval rules
formatEvalWarnings() appends footnotes
4. Fix It / thumbs-down → addLearning() writes to learnings.md
qualityTracker logs feedback
5. Nightly → findUnderperformingSkills() checks metrics
Proposals sent to CEO for approval