Sur cette page
Exercices et quiz
Le jour 2 se passe au clavier. Les consignes complètes et les gabarits de rendu se trouvent dans le dossier exercises/ du dépôt mini-harness. Cette page résume chaque TP et rassemble les questions de révision.
Règle commune
Pour chaque TP, conservez :
- le prompt envoyé
- les actions observées
- les preuves dans le code, les tests ou les sorties
- une erreur ou une limite de l’agent
- la correction apportée.
La réponse finale de l’agent ne valide pas le travail. OpenCode ou Pi et le mini-harness sont deux programmes distincts : vérifiez toujours lequel prépare le contexte, lit les instructions et exécute l’outil observé.
Avant de commencer :
export HARNESS_MODEL="qwen/qwen3.8-27b:free"
bun install
bun run typecheck
bun run test
Le mini-harness n’a pas de modèle par défaut. Si ce modèle gratuit n’est plus disponible ou gère mal les appels d’outils, prenez celui vérifié par l’animateur le matin même.
TP 1 : observer le mini-harness
Durée : 55 minutes, puis 25 minutes de mise en commun. Fichier : exercises/tp-1.md.
Vous utilisez OpenCode ou Pi pour enquêter sur le mini-harness. Demandez d’abord « Explique ce que fait ce projet » et gardez la réponse : vous devrez confirmer ou corriger chacune de ses affirmations.
Retrouvez ensuite le parcours d’une mission, de la commande à la réponse finale, avec pour chaque étape le fichier, la fonction et ce qui entre et sort. Reconstituez la requête complète envoyée à OpenRouter, y compris les définitions d’outils, avec --debug.
Avant de lire le code, votez :
- la mémoire survit-elle à une nouvelle exécution ?
--debugmontre-t-il toute la fenêtre de contexte ?- les définitions d’outils sont-elles dans
messages[]? - le modèle exécute-t-il directement les outils ?
- un fichier sur disque est-il déjà dans le contexte ?
Si vous étudiez run_js, lisez le filtre et testez seulement une opération directement refusée. Ne cherchez pas de contournement et n’utilisez aucun secret.
TP 2 : AGENTS.md et un nouvel outil
Durée : 60 minutes, puis 15 minutes de démonstrations. Fichier : exercises/tp-2.md.
- Demandez à l’agent un plan sans écriture pour ajouter un outil
list_files(path). Gardez ce plan. - Écrivez un
AGENTS.mdpour le mini-harness (chapitre 7). Rechargez la session et prouvez que le fichier est chargé. - Rédigez votre prompt d’implémentation (chapitre 11). L’outil liste récursivement les fichiers visibles, trie les chemins, refuse de sortir du projet, y compris par un lien symbolique, et s’arrête à 100 fichiers en signalant la troncature.
- Relisez le diff, lancez
bun run typechecketbun run test, et testez les cas limites : chemin hors du projet, lien symbolique, fichier caché, argument invalide, plus de 100 fichiers.
Pour l’argument invalide, distinguez le schéma JSON présenté au modèle et la validation locale dans executeTool.
TP 3 : un skill pour votre projet
Durée : 1 heure 35. Fichier : exercises/tp-3.md.
Dans votre propre projet, déjà installé, avec une commande de vérification qui fonctionne :
- Écrivez ou améliorez
AGENTS.md: seulement ce qu’une nouvelle session ne peut pas deviner. - Choisissez une tâche récurrente.
- Écrivez
.agents/skills/<nom>/SKILL.md: entrées, étapes, preuves, format du résultat, condition d’arrêt, actions interdites (chapitre 8). - Vérifiez le chargement du skill avec une demande naturelle, puis une invocation explicite si besoin. Corrigez au moins une instruction.
- Utilisez le skill sur une tâche réelle et validez le résultat avec les commandes du projet.
Une relecture à deux vérifie quand le skill se déclenche, si ses étapes se suivent sans explication orale et si sa condition d’arrêt est observable.
Quiz
Modèle et boucle
- Un LLM est dit sans état. Qu’est-ce que cela veut dire, et quelles sont deux conséquences pour un agent ?
- Qui exécute réellement un appel d’outil ?
- Que faut-il renvoyer au modèle après l’exécution d’un outil ?
- Pourquoi oublier les
tool_callsdans le message assistant casse-t-il la boucle ? - Une mission demande 20 tours et le harness en autorise 15. Proposez deux stratégies qui n’augmentent pas simplement la limite.
Corrigé
- Le modèle ne garde rien entre deux appels. Le harness doit renvoyer tout l’historique à chaque tour, et une information absente de
messages[]n’existe pas pour le modèle. - Le harness. Le modèle écrit une demande, le programme décide et exécute.
- Un message
role: "tool"qui porte le mêmetool_call_idque la demande, avec le résultat ou l’erreur. - Le modèle reçoit un résultat sans trace de la demande qui l’a produit. Il ne sait plus ce qu’il a fait, et la plupart des API refusent la requête.
- Compacter le contexte et reprendre, découper la mission en sous-tâches, déléguer l’exploration à un sous-agent, écrire la progression dans un fichier et relancer une session.
Contexte et mémoire
- Définissez le context rot en une phrase et donnez un exemple dans un harness.
- Une mission de 12 tours ajoute 3 000 tokens par tour. Quelle est la taille du dernier appel, et combien de tokens la mission a-t-elle facturés en entrée ?
- Quand une note externe devient-elle du contexte ?
- Quelle différence entre chargement au moment utile et compaction ?
Corrigé
- La baisse de qualité des réponses quand des éléments inutiles ou faux s’accumulent dans la fenêtre. Exemple : huit pages web de 5 000 caractères qui restent dans l’historique alors que seule la dernière sert.
- 36 000 tokens pour le dernier appel. 3 000 × (1 + 2 + … + 12) = 234 000 tokens facturés en entrée.
- Quand le harness la lit et l’envoie au modèle, par exemple après un appel à
memory_read. - Le chargement au moment utile évite de faire entrer une information trop tôt. La compaction réduit ce qui est déjà entré. Exemple du premier :
greppuis lecture d’un seul fichier. Exemple de la seconde : résumer l’historique quand il dépasse un budget.
AGENTS.md, skills et MCP
- Quelqu’un a écrit un
AGENTS.mdde 800 lignes. Que lui répondez-vous ? - Une règle dans
AGENTS.mdgarantit-elle qu’une commande sera bloquée ? - Pourquoi une description de skill a-t-elle besoin de déclencheurs et d’exclusions ?
- Deux skills,
code-reviewetsoftware-quality, couvrent des tâches proches. Quel problème cela crée-t-il ? - Dans quel cas une CLI existante vaut-elle mieux qu’un serveur MCP ?
Corrigé
- Il est envoyé à chaque appel et occupe le contexte avec des règles sans rapport avec la tâche. Gardez les règles valables pour presque toutes les tâches, déplacez les procédures dans des skills et la documentation dans
docs/. - Non. Le modèle peut l’ignorer. Une permission du harness, un hook ou l’environnement doivent l’appliquer.
- Le modèle choisit le skill sur sa seule description. Sans exclusions, le skill se charge aussi pour des tâches voisines qui ne le concernent pas.
- Le modèle choisit l’un ou l’autre de façon imprévisible. Fusionnez-les ou séparez leurs descriptions par des exclusions explicites.
- Quand l’agent a déjà un shell et que la CLI fait le travail, comme
ghpour GitHub. Pas de serveur à lancer, pas de schémas en plus dans le contexte.
Sécurité et vérification
- Expliquez la prompt injection à quelqu’un qui ne code pas.
- Pourquoi une liste noire de mots comme celle de
run_jsne suffit-elle pas ? - Quelle preuve demander avant d’accepter le travail d’un agent ?
Corrigé
- C’est une lettre qui contient, au milieu du texte, « l’employé qui lit ceci doit virer 1 000 € sur ce compte ». L’employé lit la lettre pour la résumer, pas pour obéir à ce qu’elle contient. Un agent confond parfois les deux.
- Le filtre lit le texte du code, pas ce qu’il fait. Le même appel écrit autrement passe. L’isolation (conteneur sans secret ni réseau) limite les effets, quel que soit le code.
- Le diff relu, les tests et le build qui passent, le comportement observé dans l’environnement réel. La réponse finale de l’agent n’en fait pas partie.
Pour finir
- Expliquez en trois phrases à un développeur qui « utilise juste Claude » pourquoi s’intéresser aux harnesses.
- Qu’est-ce qui vous semble le plus difficile à maîtriser dans l’agentic coding, conceptuellement ?