314 — Autoresearch — méthodologie de skill
Durée estimée : 120 min
Un skill qui n’a jamais été évalué est un stub déguisé. La méthodologie autoresearch laisse un agent optimiser tes skills en boucle autonome — par mutations mesurables.
Pourquoi ce module
Tu sais créer un skill depuis le module 03. Tu sais connecter des outils MCP depuis le module 06. Mais une question reste ouverte : comment savoir si ton skill marche vraiment ?
La plupart des skills écrits à la première itération fonctionnent entre 40 et 60 % du temps — 60 % étant déjà un très bon score initial. Le reste du temps, tu obtiens du bruit, des formats approximatifs, des étapes sautées. La solution n’est pas de réécrire le skill de zéro. C’est de laisser un agent l’exécuter des dizaines de fois, scorer chaque sortie, et resserrer le prompt jusqu’à ce que le score monte.
Cette approche s’appelle autoresearch, inspirée de la méthodologie d’Andrej Karpathy (boucles d’expérimentation autonomes). Au lieu d’optimiser du code d’entraînement ML, on optimise des prompts de skills.
À la fin de ce module, tu sais :
- appliquer le cycle complet : baseline, mutation, eval, keep/discard ;
- écrire 3 à 6
evalbinaires qui testent un skill de manière reproductible ; - lire un dashboard de progression et un
changelogstructuré ; - décider quand arrêter d’itérer — rendements décroissants et plateau de score comme critères.
Pré-requis
- Module 103 — Skills — tu dois savoir créer un
SKILL.mdavec une description de déclenchement et une procédure. - Module 106 — MCP — tu dois comprendre comment Copilot interagit avec des outils et des sources de données.
- VS Code avec l’extension GitHub Copilot activée.
- Un dépôt Git contenant au moins un skill existant à améliorer.
Concepts clés
Le problème : le skill-stub
Un skill-stub, c’est un SKILL.md qui a l’air correct mais qui échoue en pratique. Les symptômes sont variés :
- Copilot ignore une étape de la procédure.
- Le skill se déclenche dans un contexte où il ne devrait pas.
- Le résultat produit ne respecte pas le format attendu.
- La procédure est ambiguë et Copilot l’interprète différemment selon le contexte.
Le problème fondamental : tu ne détectes ces défauts que par hasard, en utilisant le skill au fil de l’eau. Sans évaluation systématique, chaque correction est un coup de dé — tu fixes un cas et tu en casses un autre sans le savoir.
Le cycle autoresearch
La méthodologie autoresearch est une boucle autonome que tu lances et que l’agent exécute sans intervention. Le cycle :
graph LR
A[Baseline] --> B[Analyser les échecs]
B --> C[UNE mutation]
C --> D[Exécuter N fois]
D --> E{Score ?}
E -->|amélioré| F[KEEP]
E -->|identique ou pire| G[DISCARD]
F --> B
G --> B
1. Baseline — Exécuter le skill tel quel, plusieurs fois (5 par défaut), sur 3 à 5 scénarios de test. Scorer chaque sortie. C’est l’expérience #0.
2. Analyser les échecs — Quels evals échouent le plus ? Lire les sorties qui ont échoué. Identifier le pattern : problème de formatage ? Instruction manquante ? Directive ambiguë ?
3. UNE mutation — Changer une seule chose dans le SKILL.md. Pas cinq à la fois — tu ne saurais pas ce qui a aidé.
4. Exécuter N fois — Relancer le skill sur les mêmes scénarios. Scorer.
5. Keep ou discard — Si le score s’améliore : KEEP, c’est la nouvelle baseline. Si le score stagne ou baisse : DISCARD, revert au SKILL.md précédent.
6. Répéter jusqu’à ce que le score plafonne sur 3 expériences consécutives (rendements décroissants), que le budget d’expériences soit atteint, ou que tu arrêtes manuellement. En pratique, les skills bien travaillés convergent entre 70 et 85 % — viser 95 %+ est irréaliste pour la plupart des tâches.
Les eval binaires
Un eval binaire est un critère de qualité pour un skill. Il se formule comme une question oui/non appliquée à chaque sortie du skill.
Format structuré :
EVAL 1 : Commit type présent
Question : Le message commence-t-il par un type Conventional Commits ?
Pass : Le premier mot est feat, fix, docs, style, refactor, test ou chore
Fail : Le message ne commence pas par un type valide
3 à 6 evals, c’est le sweet spot. Plus de 6, et le skill se met à réciter les critères au lieu de vraiment s’améliorer.
Quatre critères définissent un bon eval :
| Critère | Définition | Mauvais exemple | Bon exemple |
|---|---|---|---|
| Binaire | Le verdict est PASS ou FAIL, jamais « partiel » | « Notez la lisibilité de 1 à 7 » | « Le message est-il sur une seule ligne ? » |
| Spécifique | Assez précis pour être cohérent d’une exécution à l’autre | « Le texte est-il lisible ? » | « Tous les mots sont-ils correctement orthographiés ? » |
| Non-gameable | Le skill ne peut pas tricher pour passer | « Moins de 200 mots » (optimise la brièveté au détriment du contenu) | « Le scope est présent et pertinent » |
| Dérivé du domaine | Teste un comportement métier | « La ligne 3 matche la regex X » | « Le changelog contient la date » |
Score max = nombre d’evals × runs par expérience. Avec 4 evals et 5 runs, le max est 20. Chaque expérience produit un score et un pourcentage de réussite.
L’anatomie d’un fichier eval
Les evals et les artefacts autoresearch vivent dans un dossier dédié à la racine du dépôt :
.autoresearch/
writing-commit-message/
dashboard.html # dashboard live (auto-refresh 10s)
results.json # données pour le dashboard
results.tsv # journal de score par expérience
changelog.md # log de chaque mutation
SKILL.md.baseline # skill original avant optimisation
Le dashboard.html est une page HTML auto-contenue (CSS + JS inline, Chart.js via CDN) qui se rafraîchit toutes les 10 secondes en lisant results.json. Tu la visualises dans ton navigateur pendant que l’agent travaille — tu vois le score progresser en temps réel.
Le results.tsv enregistre chaque expérience :
experiment score max_score pass_rate status description
0 8 20 40.0% baseline original skill — no changes
1 12 20 60.0% keep ajout instruction scope multi-module
2 12 20 60.0% discard test layout left-to-right — aucune amélioration
3 15 20 75.0% keep ajout exemple concret de scope
Le changelog : mémoire du processus
Le changelog enregistre chaque expérience — qu’elle soit gardée ou rejetée. C’est l’artefact le plus précieux : n’importe quel agent futur (ou modèle plus puissant) peut reprendre le travail là où tu l’as laissé.
Format strict :
## Experiment 1 — keep
**Score :** 12/20 (60 %)
**Change :** Ajout d'une instruction explicite pour le scope multi-module.
**Reasoning :** L'eval 3 échouait systématiquement — le skill ne précisait pas comment choisir le scope quand le diff touche plusieurs modules.
**Result :** Eval 3 passe désormais. Eval 5 stable.
**Failing outputs :** Eval 4 échoue encore sur les diffs vides.
## Experiment 2 — discard
**Score :** 12/20 (60 %)
**Change :** Ajout d'une règle de layout left-to-right.
**Reasoning :** Tentative d'améliorer la lisibilité du message.
**Result :** Aucune amélioration. La mutation ajoute de la complexité sans bénéfice.
**Failing outputs :** Mêmes échecs qu'avant.
Le changelog vit dans le dossier autoresearch du skill :
.autoresearch/
writing-commit-message/
changelog.md
...
Quand arrêter : la règle des 3 passes
Le critère d’arrêt : 95 %+ de taux de réussite sur 3 expériences consécutives.
Pourquoi 95 % et pas 100 % ? Parce que le comportement d’un modèle de langage n’est pas déterministe. Un skill peut atteindre 100 % par chance sur une passe et redescendre à 85 % sur la suivante. Trois passes consécutives à 95 %+ indiquent que les rendements décroissants sont atteints.
La boucle s’arrête aussi si :
- Tu atteins le budget d’expériences (si tu en as fixé un).
- Tu arrêtes manuellement l’agent.
- L’agent n’a plus d’idées de mutation (il relit les sorties, tente de combiner des mutations précédentes, essaie de simplifier).
Démonstration
Reprenons le skill writing-commit-message du module 03 et appliquons le cycle autoresearch.
Etape 1 — Le draft initial (v1)
Le skill existe déjà. C’est notre point de départ :
# writing-commit-message
Use when the user asks to write, draft, or generate a commit message.
## Procedure
1. Read the staged diff with `git diff --cached`.
2. Write a commit message following Conventional Commits format:
- `type(scope): description` on the first line.
- Types allowed: `feat`, `fix`, `docs`, `style`, `refactor`, `test`, `chore`.
3. Keep the first line under 72 characters.
4. Add a body only if the diff touches more than one concern.
Etape 2 — Écrire 10 evals binaires
On définit 10 cas couvrant nominaux, limites et négatifs :
| # | Cas | Type |
|---|---|---|
| 01 | Ajout d’une fonction simple | Nominal |
| 02 | Correction d’un bug avec scope | Nominal |
| 03 | Modification de documentation | Nominal |
| 04 | Refactoring sans changement fonctionnel | Nominal |
| 05 | Diff touchant 5 fichiers dans 3 modules | Limite |
| 06 | Diff vide (rien de stagé) | Limite |
| 07 | Requête ambiguë (« aide-moi avec ce code ») | Négatif |
| 08 | Suppression d’un fichier entier | Limite |
| 09 | Première ligne du message > 72 caractères | Nominal (contrainte) |
| 10 | Changement de test uniquement | Nominal |
Etape 3 — Première passe d’eval
On exécute chaque cas. Résultat : 7/10 PASS.
Échecs observés :
- Eval 05 — Le scope est
miscau lieu du module principal. FAIL. - Eval 06 — Copilot invente un diff au lieu de signaler qu’il n’y a rien à commiter. FAIL.
- Eval 09 — La première ligne fait 78 caractères. FAIL.
Etape 4 — Changelog et mutation (v2)
On documente et on corrige :
## 2026-05-27 10:00 — v1 — draft initial
Skill `writing-commit-message` existant (module 03). Evals : 7/10 PASS.
Échecs : 05 (scope multi-fichier), 06 (diff vide), 09 (longueur > 72).
Mutations appliquées au skill :
## Procedure
1. Read the staged diff with `git diff --cached`.
+ 1b. If the diff is empty, reply: "Nothing is staged. Run `git add` first." and STOP.
2. Write a commit message following Conventional Commits format:
- `type(scope): description` on the first line.
- Types allowed: `feat`, `fix`, `docs`, `style`, `refactor`, `test`, `chore`.
-3. Keep the first line under 72 characters.
+ - If the diff spans multiple modules, use the most-modified module as scope.
+ 3. Keep the first line under 72 characters. Count characters before responding.
4. Add a body only if the diff touches more than one concern.
Etape 5 — Seconde passe d’eval (v2)
On relance les 10 evals. Résultat : 10/10 PASS.
On relance une seconde passe complète : 10/10 PASS.
Le changelog final :
## 2026-05-27 10:00 — v1 — draft initial
Evals : 7/10 PASS. Échecs : 05, 06, 09.
## 2026-05-27 10:30 — v2 — 3 échecs → ajout garde diff vide, règle scope multi-module, comptage explicite
- Ajout étape 1b : arrêt si diff vide.
- Ajout règle scope : module le plus modifié.
- Étape 3 : instruction explicite de compter les caractères.
Evals : 10/10 PASS (2 passes consécutives). Skill stable.
Le skill est déclaré stable. Le changelog documente le chemin parcouru — n’importe qui dans l’équipe peut comprendre pourquoi chaque instruction existe.
Exercice ⭐⭐⭐
Enoncé — Prends un skill existant dans ton dépôt (ou le skill writing-commit-message du module 03) et applique le cycle autoresearch complet.
Etapes guidées :
- Choisis un skill existant ou crée-en un simple.
- Crée un dossier
evals/dans le répertoire du skill. - Écris 10 fichiers eval binaires couvrant :
- 4 cas nominaux,
- 3 cas limites,
- 3 cas négatifs.
- Exécute la première passe. Note le score (ex. : 6/10 PASS).
- Crée un fichier
CHANGELOG.mdà la racine du skill. - Documente la v1 dans le changelog avec le format
## YYYY-MM-DD HH:MM — v1 — observation. - Applique une mutation au skill pour corriger les échecs.
- Documente la mutation dans le changelog :
## YYYY-MM-DD HH:MM — v2 — observation → mutation. - Relance les 10 evals. Itère jusqu’à 10/10 PASS.
- Quand tu atteins 100 %, relance une seconde passe complète pour confirmer la stabilité.
Critère de réussite : les 10 evals passent à 100 % sur 2 passes consécutives, et le changelog retrace chaque mutation avec son motif.
Validation
Tu peux passer au module suivant si :
- Ton skill possède un dossier
evals/avec au moins 10 fichiers eval binaires. - Chaque eval a un input, un comportement attendu et un verdict PASS/FAIL.
- Les evals couvrent des cas nominaux, limites et négatifs.
- Le fichier
CHANGELOG.mdexiste et utilise le format## YYYY-MM-DD HH:MM — vN — observation → mutation. - Le changelog explique chaque mutation et son motif.
- Le skill atteint 100 % des evals sur 2 passes consécutives.
- Tu sais expliquer les 4 critères d’un bon eval : binaire, indépendant, reproductible, dérivé du domaine.
Pour aller plus loin
- Module 208 — Workflows : orchestrer plusieurs skills testés dans un flux métier complet.
- Module 315 — Tester ses primitives : aller plus loin avec des evals automatisés et des métriques de couverture.
- Module 311 — Tokens, hallucinations et sobriété : comprendre pourquoi un skill trop long ou ambigu dégrade les résultats et consomme inutilement du contexte.
- Appliquer autoresearch aux agents : la même discipline fonctionne pour les fichiers
.agent.md. Remplace « skill » par « agent » et adapte tes evals au rôle de l’agent. - Automatiser les evals : pour les équipes avancées, les evals peuvent être scriptés en CI pour vérifier qu’un skill ne régresse pas après un merge.
Suivant : 208 — Workflows