
Habilidade de proteção em tempo de execução que detecta e bloqueia ataques maliciosos induzidos por habilidades em agentes aumentados por habilidades, com um loop MCTS que evolui a política de proteção a partir do feedback das execuções.
🎉 Aceito na NeurIPS 2026 🎉
Agentes aumentados por skills (SAAs), como Claude Code e OpenClaw, carregam skills reutilizáveis — instruções empacotadas, scripts e orientações de fluxo de trabalho — como contexto persistente em tempo de execução. Isso torna os agentes mais capazes, mas também dá a uma skill maliciosa um canal duradouro para direcionar ações futuras: ela pode esperar até que uma tarefa concreta do usuário e o estado do workspace façam uma ação insegura parecer útil. A verificação pré-instalação, por si só, é, portanto, insuficiente — a proteção deve ocorrer em tempo de execução, condicionada à tarefa.
Defense-as-Skill transforma a guarda em tempo de execução em um artefato de skill de primeira classe:
Um detalhe de implantação importa: uma skill de segurança é relevante para quase qualquer tarefa, então o pareamento comum tarefa–skill tende a ignorá-la. Portanto, tratamos uma instrução de invocação explícita (direcionando o agente a consultar skill-sonar antes de tomar ações) como parte da configuração de implantação, não como uma conveniência experimental — as ablações mostram que ela é essencial para a eficácia da guarda.
O dataset SCOPE-R — um dataset condicionado por tarefa de ataques induzidos por skills em SAAs, com 6 famílias de risco, 21 subcategorias, 206 instâncias maliciosas com ataque confirmado e 43 tarefas benignas, dividido por família de risco em treino / teste ID / teste OOD — está hospedado no Hugging Face e é baixado separadamente (veja o passo 0 em Início rápido). Este repositório contém a guarda e o código que a avalia e a evolui:
| Componente | Descrição |
|---|---|
| SkillSonar\ | O pacote da skill de guarda em tempo de execução (eval/safetySkill/skill-sonar/), além do framework de avaliação em tempo de execução (eval/) que mede ASR, utilidade da tarefa, contagem de confirmações e custo de tokens sob cada condição de defesa. |
| Evolução da skill de guarda\ | O loop MCTS (evolution/) que evolui a skill de guarda em disco a partir do feedback dos rollouts: seleção UCT sobre uma árvore de versões da skill, rollouts de avaliação barata e refinamento multi-variante em uma única chamada via claude -p. |
O framework de avaliação lê tasks/, injected-skills/, attack-metadata/, benign-skills/, split/ a partir da raiz de eval/. Baixe o SCOPE-R do Hugging Face e copie-os para lá:
git clone https://huggingface.co/datasets/fffovo/SCOPE-R /tmp/scope-r
cp -r /tmp/scope-r/dataset/{tasks,injected-skills,attack-metadata,benign-skills,split} eval/
cp eval/run/config.example.sh eval/run/config.sh # fill in your endpoint credentials
Uma rodada ponta a ponta com avaliação real e um refinador claude real:
./run_smoke_loop.sh --max-rounds 1
./run_mcts.sh --max-rounds 3
# plumbing only (no benchmark, no claude):
PYTHONPATH=. python3 -m evolution.cli --dry-run --max-rounds 1
# plumbing + analyzer + pool, with a synthetic subset instead of the benchmark:
PYTHONPATH=. python3 -m evolution.cli \
--simulate-round tests/synthetic_smoke.jsonl --skip-refine --max-rounds 1
# bootstrap only (seed backup + active skill + deploy, then exit):
PYTHONPATH=. python3 -m evolution.cli --bootstrap-only
Todos os parâmetros ficam em config/default.yaml (loop de pool plano) e config/mcts.yaml (loop MCTS); qualquer um deles pode ser sobrescrito via flags de CLI ou um arquivo --config personalizado.
SCOPE-R dataset (HF) ──▶ eval/ (runtime evaluation) ──▶ evolution/ (MCTS loop)
tasks, skills, subsets/, run/, analyzer → refiner
attack-metadata scripts/ (judge, grading), → skill tree → next round
safetySkill/ (SkillSonar)
Cada iteração do MCTS:
eval/safetySkill/skill-sonar/ e executa o avaliador em tempo de execução: juiz de ASR, avaliador de utilidade, contagem de confirmações, custo de tokens, além de narrativas de failure_reason / success_reason por tarefa escritas pelo juiz e uma taxonomia determinística de failure_stage (guard_not_read / guard_not_triggered / guard_triggered_but_bypassed / ...).claude -p produz k variantes filhas, cada uma aplicando uma pequena edição local diferente, direcionada a um padrão de falha dominante distinto.A busca para quando a pontuação de segurança atinge o limiar de sucesso (padrão: ASR ≤ 5%), o orçamento de avaliação completa se esgota, ou não restam candidatos expansíveis. O melhor candidato totalmente avaliado é reportado como a guarda final.
O objetivo é segurança em primeiro lugar, com preferências secundárias:
s(v) = (1 − ASR_v) + ε · ( λ_b·U_benign + λ_m·U_malicious − λ_q·C̃_v − λ_t·K̃_v )
de modo que, entre candidatos igualmente seguros, a busca prefere guardas que preservam a utilidade da tarefa, interrompem menos o usuário e custam menos tokens. Uma guarda degenerada que recusa tudo pontua mal por design.