Criando Skills
Guia passo a passo para adicionar novas capacidades ao seu projeto Arc OS.
O Que É uma Skill
Uma skill é um conjunto portátil de instruções que ensina ao seu bot de IA uma capacidade específica. As skills ficam no diretório skills/ e são compostas por:
skill.md— o arquivo de instruções (obrigatório)<name>.evals.json— regras de validação automática de qualidade (opcional, mas recomendado)references/— documentos de apoio, schemas, exemplos (opcional)
skills/
├── _registry.json ← Central registry
├── my-new-skill/
│ ├── skill.md ← What the AI should do
│ ├── my-new-skill.evals.json ← How to validate the output
│ └── references/ ← Context documents
└── library/
└── domain-expert.md ← Simple single-file skills
Passo 1: Escreva o skill.md
Este é o núcleo da instrução. Claude lê este arquivo quando a skill é ativada.
Template
# 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
Diretrizes
- Menos de 500 palavras — skills mais longas diluem o contexto
- Modo imperativo — "Verifique o repositório", não "Você deveria verificar"
- Exemplos concretos — mostre pares esperados de entrada/saída
- Referências específicas de ferramentas — mencione os comandos, APIs ou padrões a usar
Exemplo: 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
Passo 2: Escreva os Evals (Regras de Qualidade)
Evals são regras declarativas que validam automaticamente cada resposta. Eles rodam depois que Claude gera o output e adicionam notas de aviso caso alguma regra falhe.
Nomenclatura do arquivo
skills/<name>/<name>.evals.json
Schema
{
"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"
}
]
}
Tipos de Regra Disponíveis
| Tipo | O Que Verifica | Campo Usado |
|---|---|---|
string_contains |
A resposta inclui o texto literal | value (string) |
string_not_contains |
A resposta NÃO inclui o texto | value (string) |
regex_match |
A resposta corresponde ao regex | pattern (string) |
regex_not_match |
A resposta NÃO corresponde ao regex | pattern (string) |
max_length |
Tamanho da resposta <= N caracteres | value (number) |
min_length |
Tamanho da resposta >= N caracteres | value (number) |
Níveis de Severidade
warning— Indica um problema de qualidade. Exibido como⚠️.info— Nota informativa. Exibido comoℹ️.
Exemplo
{
"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"
}
]
}
Dicas
- Comece com 2-3 regras. Adicione mais conforme identificar padrões nas correções.
- Segurança em primeiro lugar:
string_not_containspara comandos perigosos,regex_not_matchpara padrões de credenciais. - Convenção de ID:
<prefixo-da-skill>-<número>(ex.:oe-001,gm-002). - Teste: Envie uma mensagem que deveria ativar a skill e verifique se os avisos aparecem corretamente.
Passo 3: Registre em _registry.json
O registry informa ao Context Router sobre sua skill para que ela possa ser recomendada em mensagens relevantes.
Adicione uma entrada
{
"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 pontos cada): Sinais de invocação direta. O usuário quer explicitamente esta skill.
- "deploy", "review", "scaffold", "odoo", "audit"
Keywords (1 ponto cada): Termos mais amplos que sugerem relevância sem serem comandos diretos.
- "OWASP", "Docker", "CI/CD", "production", "module"
Diretrizes
- Inclua equivalentes em ucraniano nos triggers para times bilíngues
- Mantenha as descrições com menos de 80 caracteres (truncado no SKILLS_HINT)
- 5-8 triggers por skill (mais = correspondências ruidosas)
- Keywords são opcionais, mas melhoram significativamente o roteamento
Passo 4: Library Skills (Formato Simples)
Para expertise de domínio que não precisa de evals ou de um diretório dedicado, use skills/library/:
skills/library/
├── docker-ops.md
├── postgres-pro.md
└── react-patterns.md
São arquivos .md individuais. Sem diretório, sem evals, sem referências. Ideal para skills com muito conhecimento e pouca necessidade de validação.
Checklist
-
skills/<name>/skill.md— instrução com Purpose, Protocol, Constraints -
skills/<name>/<name>.evals.json— pelo menos 2 regras de validação - Entrada em
skills/_registry.json— com triggers e keywords - Nome idêntico em todos os lugares — nome do diretório = nome da skill no eval = nome no registry
- Teste: envie uma mensagem de trigger → verifique o SKILLS_HINT nos logs
- Teste: provoque intencionalmente uma falha de eval → verifique se o aviso aparece
O Que Acontece em Tempo de Execução
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