
Compétence de garde d'exécution qui détecte et bloque les attaques malveillantes induites par les compétences dans les agents augmentés par compétences, avec une boucle MCTS qui fait évoluer la politique de garde à partir des retours de déploiement.
🎉 Accepté à NeurIPS 2026 🎉
Les agents augmentés par compétences (SAA), tels que Claude Code et OpenClaw, chargent des compétences réutilisables — instructions empaquetées, scripts et guides de workflow — comme contexte d'exécution persistant. Cela rend les agents plus performants, mais donne aussi à une compétence malveillante un canal durable pour orienter les actions futures : elle peut attendre qu'une tâche utilisateur concrète et un état d'espace de travail rendent une action dangereuse apparemment utile. Une vérification préalable à l'installation est donc insuffisante — la protection doit s'effectuer à l'exécution, en fonction de la tâche.
Defense-as-Skill transforme le garde à l'exécution en un artefact de compétence de premier ordre :
Un détail de déploiement compte : une compétence de sécurité est pertinente pour presque toutes les tâches, de sorte que l'appariement ordinaire tâche–compétence tend à la négliger. Nous traitons donc une instruction d'invocation explicite (demandant à l'agent de consulter skill-sonar avant d'agir) comme faisant partie de la configuration de déploiement, et non comme une commodité expérimentale — les ablations montrent qu'elle est essentielle à l'efficacité du garde.
Le jeu de données SCOPE-R — un jeu de données conditionné par la tâche, portant sur les attaques induites par compétences contre les SAA, avec 6 familles de risques, 21 sous-catégories, 206 instances malveillantes confirmées par attaque et 43 tâches bénignes, réparties par famille de risques en train / ID-test / OOD-test — est hébergé sur Hugging Face et téléchargé séparément (voir l'étape 0 de Démarrage rapide). Ce dépôt contient le garde et le code qui l'évalue et le fait évoluer :
| Composant | Description |
|---|---|
| SkillSonar\ | Le paquet de compétence de garde à l'exécution (eval/safetySkill/skill-sonar/), ainsi que le cadre d'évaluation à l'exécution (eval/) qui mesure l'ASR, l'utilité des tâches, le nombre de confirmations et le coût en tokens dans chaque condition de défense. |
| Évolution de la compétence de garde\ | La boucle MCTS (evolution/) qui fait évoluer la compétence de garde sur disque à partir des retours de rollout : sélection UCT sur un arbre de versions de compétence, rollouts d'évaluation à faible coût, et raffinement multi-variantes en un seul passage via claude -p. |
Le cadre d'évaluation lit tasks/, injected-skills/, attack-metadata/, benign-skills/, split/ depuis la racine eval/. Téléchargez SCOPE-R depuis Hugging Face et copiez-les dedans :
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
Un round de bout en bout avec une évaluation réelle et un vrai raffineur claude :
./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
Tous les réglages se trouvent dans config/default.yaml (boucle à pool plat) et config/mcts.yaml (boucle MCTS) ; chacun d'eux peut être remplacé via des options CLI ou un fichier --config personnalisé.
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)
Chaque itération MCTS :
eval/safetySkill/skill-sonar/ et exécuter l'évaluateur à l'exécution : juge ASR, évaluateur d'utilité, nombre de confirmations, coût en tokens, plus des récits failure_reason / success_reason rédigés par le juge pour chaque tâche et une taxonomie déterministe failure_stage (guard_not_read / guard_not_triggered / guard_triggered_but_bypassed / ...).claude -p produit k variantes enfants, chacune appliquant une petite modification locale différente ciblant un schéma d'échec dominant distinct.La recherche s'arrête lorsque le score de sécurité atteint le seuil de réussite (par défaut : ASR ≤ 5 %), que le budget d'évaluation complète est épuisé, ou qu'il ne reste plus de candidats extensibles. Le meilleur candidat pleinement évalué est rapporté comme garde final.
L'objectif est la sécurité d'abord, avec des préférences secondaires :
s(v) = (1 − ASR_v) + ε · ( λ_b·U_benign + λ_m·U_malicious − λ_q·C̃_v − λ_t·K̃_v )
de sorte que, parmi des candidats également sûrs, la recherche préfère les gardes qui préservent l'utilité des tâches, interrompent moins l'utilisateur et coûtent moins de tokens. Un garde dégénéré qui refuse tout obtient un mauvais score par conception.