La plupart des gens essaient de corriger les agents IA à la mauvaise couche.
Quand un agent échoue, ils réécrivent le prompt. Quand il échoue à nouveau, ils ajoutent des instructions, changent de modèle, augmentent la fenêtre de contexte ou connectent un autre outil.
Puis les mêmes problèmes reviennent.
L'agent oublie une décision importante. Il utilise le mauvais outil. Il perd le fil de ce qui s'est passé trois étapes plus tôt. Il affirme que la tâche est terminée sans vérifier le résultat. Il retente la même action en échec jusqu'à épuiser le budget.
Le problème ne vient pas toujours du modèle.
Le problème vient de l'environnement qui l'entoure.
Cet environnement, c'est le harness.
Le Harness Engineering consiste à construire le système autour d'un modèle : un système qui décide de ce qu'il peut voir, de ce qu'il peut faire, de ce dont il se souvient, de ce qui compte comme un succès et de ce qui se passe quand quelque chose échoue.
Un meilleur prompt peut améliorer une seule réponse.
Un meilleur harness améliore chaque exécution.
Suivez mon Substack pour plus d'analyses pratiques sur les agents IA, l'automatisation et les systèmes en production :
1. Le modèle n'est pas l'agent
Un modèle peut raisonner, générer, comparer et choisir.
Cela n'en fait pas un agent fiable pour autant.
Un véritable agent doit aussi trouver le bon contexte, utiliser des outils, préserver son état, respecter les permissions, vérifier son propre travail et récupérer quand l'environnement se comporte différemment de ce qui était prévu.
Le modèle n'est que le moteur de raisonnement.
Le harness est tout ce qui transforme ce raisonnement en exécution réelle.
1DEMANDE UTILISATEUR2 |3 v4+-----------------------------+5| HARNESS |6| |7| contrat contexte |8| outils état |9| politique vérification |10| traces récupération |11+-----------------------------+12 |13 v14 MODÈLE15 |16 v17ENVIRONNEMENT RÉEL
Placez le même modèle dans une boîte de chat et il répondra à des questions.

Placez-le dans un dépôt avec accès au terminal, tests, outils navigateur, mémoire de projet, permissions contrôlées et boucle de révision, et il pourra accomplir un vrai travail.
Le modèle n'a pas changé.
Le harness, si.
2. Transformez chaque demande en contrat
Le langage naturel est flexible.
L'exécution autonome ne devrait pas l'être.
Une demande comme :
Améliore le parcours d'onboarding.
convient très bien quand un humain est assis à côté du modèle.
Elle est catastrophique comme instruction de production.
Avant que l'agent n'agisse, transformez la demande en un contrat de tâche délimité.

1objectif: réduire l'abandon lors de l'onboarding23entrées:4 - brief produit5 - données analytiques6 - dépôt78contraintes:9 - préserver l'authentification10 - ne pas modifier le schéma de base de données11 - conserver le comportement mobile actuel1213livrable:14 - pull request révisable1516terminé_quand:17 - les tests passent18 - l'événement analytique se déclenche correctement19 - le parcours desktop passe la révision20 - le parcours mobile passe la révision2122approbation_requise:23 - déploiement en production
L'élément crucial est terminé_quand.
Sans lui, l'agent peut résoudre une version légèrement plus simple du problème et affirmer en toute confiance que la tâche est terminée.
Avec lui, l'achèvement devient mesurable.
L'agent ne devrait pas demander :
Que dois-je faire ensuite ?
Il devrait demander :
Quelle action rapproche l'environnement actuel du résultat convenu dans le contrat ?
C'est une boucle bien plus robuste.
3. Donnez à l'agent une carte, pas une fenêtre de contexte géante
Le réflexe courant face aux erreurs d'un agent est de donner plus de contexte au modèle.
Plus de documentation.
Plus d'historique de conversation.
Plus de fichiers.
Plus de sorties d'outils.
À la fin, l'agent reçoit tout et comprend moins.
Le contexte n'est pas du stockage.
C'est un budget d'attention.

Au lieu de déverser tout le projet dans chaque exécution, donnez à l'agent une petite carte indiquant où se trouvent les informations utiles.
1CARTE DU PROJET23règles produit -> docs/product/4architecture -> docs/architecture.md5frontend -> apps/web/6backend -> services/api/7tests -> tests/8commandes -> docs/commands.md9sécurité -> docs/security.md
Puis n'étendez cette vue qu'en cas de besoin.
1TÂCHE2 |3 v4CARTE DU PROJET5 |6 v7SYSTÈME PERTINENT8 |9 v10FICHIERS EXACTS11 |12 v13INSTRUCTIONS LOCALES
Le document source décrit cela comme une divulgation progressive : le harness doit charger plus d'informations parce que la tâche en a besoin, et non simplement parce que ces informations existent.
L'objectif n'est pas d'avoir un contexte maximal.
L'objectif est d'avoir un signal utile maximal.
4. Placez une passerelle entre le modèle et ses outils
Un modèle doté de vingt outils n'est pas automatiquement vingt fois plus performant.
Il a peut-être simplement vingt façons supplémentaires d'échouer.
Chaque outil devrait avoir un contrat.
1OUTIL : edit_file23ENTRÉES4chemin5patch67PRÉCONDITIONS8le chemin existe9le chemin est dans l'espace de travail1011SUCCÈS12patch appliqué13diff renvoyé1415ÉCHEC16erreur structurée17aucun écrasement partiel1819RISQUE20réversible
Le chemin d'exécution devient alors :
1LE MODÈLE PROPOSE2 |3 v4LA PASSERELLE VALIDE5 |6 v7LA POLITIQUE AUTORISE8 |9 v10L'OUTIL EXÉCUTE11 |12 v13LE HARNESS ENREGISTRE LE RÉSULTAT
Le modèle décide de l'action qu'il souhaite effectuer.
Le harness décide si cette action est valide, autorisée et sûre.

Cette distinction devient critique lorsque les outils peuvent envoyer des messages, modifier la production, dépenser de l'argent ou supprimer des données.
Une bonne passerelle d'outils peut également ajouter des timeouts, valider les arguments, restreindre les chemins de fichiers, normaliser les erreurs et rendre les tentatives sécurisées.
De bons outils réduisent le nombre de choses que le modèle doit deviner.
5. Sortez la mémoire de la conversation
La conversation ne devrait pas être le système de référence.
Les agents de longue durée finissent par atteindre les limites de contexte, planter, redémarrer ou transmettre le travail à une autre session.
Si chaque décision importante n'existe que dans le transcript, le workflow est fragile.
Stockez l'état durable séparément.

1{2 "task_id": "feature_042",3 "status": "vérification",4 "current_step": "vérification_mobile",56 "completed": [7 "implémentation",8 "tests_unitaires",9 "vérification_desktop"10 ],1112 "decisions": [13 "réutiliser le endpoint d'export existant",14 "conserver le format de date actuel"15 ],1617 "artifacts": [18 "export.csv",19 "desktop-after.png"20 ],2122 "open_risks": [23 "la barre d'outils mobile pourrait déborder"24 ],2526 "next_action": "rendre la vue mobile"27}
Un système efficace sépare la mémoire en quatre catégories :
1FAITS2connaissances stables34DÉCISIONS5ce qui a été choisi et pourquoi67ÉTAT8où en est l'exécution actuelle910LEÇONS11échecs qui devraient influencer les exécutions futures
La prochaine session de l'agent devrait hériter de l'état du travail, et non d'une histoire compressée de la conversation précédente.
6. Faites de la preuve la condition d'achèvement
Un agent qui dit « terminé » ne prouve pas que le travail est fait.

Ce n'est qu'une sortie de modèle de plus.
Le harness a besoin de preuves observables.
1AFFIRMATION PREUVE23"le bug est corrigé" le test qui échouait passe désormais45"la page fonctionne" le parcours navigateur est terminé67"les données sont justes" les valeurs correspondent à la source89"la migration est sûre" simulation + rollback réussis1011"la tâche est terminée" tous les critères d'acceptation sont validés
Privilégiez d'abord les vérifications déterministes.
1syntaxe2 |3 v4types5 |6 v7tests ciblés8 |9 v10tests d'intégration11 |12 v13révision visuelle / sémantique14 |15 v16approbation humaine
Ne demandez pas à un autre modèle de répondre à quelque chose qu'un compilateur, un test, un schéma ou une requête de base de données peut prouver.
Utilisez les modèles pour le jugement.
Utilisez les systèmes déterministes pour les faits.
Le modèle crée l'artefact.
L'environnement crée des preuves concernant cet artefact.
Le harness décide si ces preuves sont suffisantes.
7. Séparez le constructeur du vérificateur
L'auto-révision pose un autre problème.
L'agent qui a commis l'erreur transporte souvent les mêmes hypothèses dans sa phase de révision.

Une architecture plus solide sépare l'exécutant du vérificateur.
1CONSTRUCTEUR2 |3 v4crée un candidat5 |6 v7VÉRIFICATEUR8 |9 +-- vérifie le contrat10 +-- cherche les cas manquants11 +-- teste les affirmations non étayées12 +-- tente de casser le résultat13 |14 +------ SUCCÈS ------> ACCEPTER15 |16 +------ ÉCHEC ------> RENVOYER LES PREUVES
Le vérificateur ne devrait pas demander :
Est-ce que ça a l'air correct ?
Il devrait demander :
Qu'est-ce qui rendrait ceci inacceptable ?
Cela transforme la révision : on passe de la confirmation à la tentative de réfutation.
Le document source recommande explicitement de donner à la vérification ses propres critères de rejet et suffisamment d'indépendance pour remettre en question les hypothèses qui ont produit le premier résultat.
8. Sortez les permissions du modèle
Certaines règles ne devraient jamais dépendre de la capacité du modèle à s'en souvenir.
1ne jamais publier sans approbation2ne jamais exposer de secrets3ne jamais dépasser la limite de dépenses4ne jamais écrire en dehors de l'espace de travail5ne jamais affirmer que les tests ont réussi s'ils n'ont pas été exécutés
Ce ne sont pas des suggestions de prompt.

Ce sont des politiques.
Une échelle de permissions simple :
1FAIBLE RISQUE23lire4chercher5inspecter67-> automatique89RÉVERSIBLE1011modifier l'espace de travail12exécuter des tests13créer un brouillon1415-> automatique + trace1617EFFET EXTERNE1819envoyer20déployer21acheter2223-> approbation requise2425IRRÉVERSIBLE / SENSIBLE2627supprimer des données28faire tourner les identifiants29publier globalement3031-> blocage strict ou interdit
Plus la conséquence est forte, plus le contrôle doit l'être.
Le modèle peut recommander l'action.
Le harness l'autorise.
L'outil l'exécute.
L'autonomie n'est pas l'absence de contrôle.
C'est la liberté à l'intérieur d'une limite imposée.
9. Arrêtez de retenter à l'aveugle
L'une des pires politiques de récupération est :
Quelque chose a échoué. Réessaie.
Si rien ne change, le système paie simplement pour reproduire le même échec.
Les échecs doivent d'abord être classifiés.

1TIMEOUT D'OUTIL2-> retenter avec backoff34ARGUMENTS INVALIDES5-> réparer l'appel d'outil67CONTEXTE MANQUANT8-> récupérer la source manquante910TEST ÉCHOUÉ11-> inspecter le comportement défaillant1213PERMISSION REFUSÉE14-> demander une approbation1516EXIGENCES CONTRADICTOIRES17-> escalader1819ÉCHEC RÉPÉTÉ SANS CHANGEMENT20-> arrêter
Une boucle d'agent efficace ressemble à ceci :
1OBSERVER2 |3 v4DÉCIDER5 |6 v7AGIR8 |9 v10MESURER11 |12 +---- ACCEPTER13 |14 +---- RÉPARER15 |16 +---- ESCALADER17 |18 +---- ARRÊTER
Chaque boucle devrait avoir des limites en nombre de tentatives, en temps, en dépenses et en portée destructrice.
Un agent fiable doit savoir comment continuer.
Il doit aussi savoir quand une nouvelle tentative n'en vaut plus la peine.
10. Transformez les instructions répétées en infrastructure
Supposons que le prompt contienne :
Exécute toujours le formateur.
Cette règle est plus forte si le formateur s'exécute automatiquement.
Supposons que les instructions disent :
Le code UI ne doit pas accéder directement à la base de données.
C'est plus fort sous forme de test d'architecture qui échoue lorsque la règle est enfreinte.
La progression ressemble à ceci :
1EXPLICATION2 |3 v4CHECKLIST5 |6 v7MODÈLE8 |9 v10VÉRIFICATION AUTOMATISÉE11 |12 v13POLITIQUE IMPOSÉE
Le prompt devrait expliquer le jugement.
Le harness devrait imposer les invariants.
Chaque erreur récurrente devrait descendre un peu plus bas sur cette échelle.
À terme, le modèle n'a plus besoin de retenir la leçon.
L'environnement s'en souvient pour lui.
11. Enregistrez l'exécution
Un artefact final parfait peut masquer un chemin d'exécution désastreux.
Peut-être que l'agent a accédé à la mauvaise source.
Peut-être qu'il a ignoré une commande en échec.
Peut-être qu'il a répété deux fois une action externe.
Peut-être qu'il a dépensé dix fois le budget prévu.
Peut-être qu'il a trouvé la bonne réponse pour la mauvaise raison.
Enregistrez suffisamment d'informations pour reconstituer ce qui s'est passé.
109:14 contrat de tâche créé209:15 architecture.md chargé309:17 checkout.ts modifié409:18 échec du test ciblé509:21 implémentation réparée609:22 test ciblé réussi709:24 test d'intégration réussi809:25 déploiement bloqué : approbation requise
Les traces utiles incluent les sources de contexte, les appels d'outils, les changements d'état, les résultats de vérification, les raisons des nouvelles tentatives, les décisions d'approbation, le coût et la latence.
L'idée n'est pas de collecter des logs pour le plaisir.
L'idée est de localiser l'échec.
Si l'étape 18 casse, vous devriez pouvoir réparer l'étape 18.
Vous ne devriez pas avoir à rejouer toute l'exécution.
12. Fournissez un reçu pour chaque exécution
Ne forcez pas un humain à relire un transcript de quarante messages.
Compilez le résultat dans un petit reçu.
1OBJECTIF23Corriger l'application en double des coupons.45MODIFIÉ67validation du checkout8test de non-régression910VÉRIFIÉ1112lint réussi13tests unitaires réussis14test d'intégration réussi1516NON VÉRIFIÉ1718fournisseur de paiement en production1920RISQUES2122client mobile legacy indisponible2324APPROBATION NÉCESSAIRE2526déploiement en staging
Ce n'est pas un résumé de ce que le modèle prétend s'être passé.
C'est un résumé de ce que le harness peut prouver s'être passé.
Cette distinction rend le reçu utile pour les révisions, les passations et les futures sessions d'agent.
13. Faites en sorte que chaque échec améliore le harness
La plupart des équipes corrigent le résultat défaillant.
La meilleure approche consiste à corriger le système qui a permis l'échec.
1CONTEXTE MANQUANT2-> améliorer la carte du projet34MAUVAIS OUTIL5-> améliorer le routage ou le contrat de l'outil67MAUVAIS RÉSULTAT8-> ajouter un validateur910BOUCLE RÉPÉTÉE11-> ajouter une limite de tentatives1213ACTION NON SÛRE14-> ajouter une barrière de permission1516DÉCISION PERDUE17-> persister l'état1819ÉCHEC INCONNU20-> améliorer le traçage
C'est là que le Harness Engineering commence à produire des effets cumulatifs.
Un résultat réparé aide une seule exécution.
Un harness réparé améliore toutes les exécutions suivantes.
Les meilleurs systèmes d'agents deviennent plus fiables parce que les erreurs laissent derrière elles de l'infrastructure.
14. Commencez par le plus petit harness utile
Vous n'avez pas besoin d'une énorme plateforme d'orchestration pour démarrer.
Construisez par couches.
1NIVEAU 023prompt4modèle56NIVEAU 178contrat de tâche9carte du projet10outils1112NIVEAU 21314état structuré15vérification16boucle délimitée1718NIVEAU 31920permissions21traces22récupération23barrières humaines
Une courte tâche de recherche peut n'avoir besoin que d'un prompt et d'une révision.
Une tâche de codage de six heures avec accès aux fichiers, au réseau et capacité de déploiement en nécessite beaucoup plus.
Ajoutez de la complexité uniquement lorsque la surface d'échec le justifie.
Pas parce que l'architecture d'agents a l'air cool.
La checklist du Harness Engineering
Avant d'accorder une autonomie significative à un agent, demandez-vous :
1[ ] Le succès est-il défini avant l'exécution ?23[ ] L'agent peut-il trouver le bon contexte4 sans tout charger ?56[ ] Chaque outil a-t-il un objectif clair,7 un schéma et un état d'échec ?89[ ] Les décisions importantes sont-elles stockées10 en dehors de la conversation ?1112[ ] L'achèvement exige-t-il des preuves ?1314[ ] Les actions risquées sont-elles protégées par une politique ?1516[ ] Chaque boucle a-t-elle une limite de tentatives ?1718[ ] L'exécution peut-elle reprendre après une interruption ?1920[ ] Pouvez-vous reconstituer chaque action importante ?2122[ ] Un échec améliore-t-il une règle, un outil,23 un test, une carte ou une permission ?2425[ ] La modification finale peut-elle être annulée ?
Si plusieurs réponses sont négatives, un modèle plus puissant ne rendra pas automatiquement l'agent fiable.
Il pourrait simplement rendre l'échec plus rapide et plus coûteux.
Le véritable changement de paradigme
Le Prompt Engineering demande :
Que dois-je dire au modèle ?
Le Context Engineering demande :
Que devrait savoir le modèle à cet instant précis ?
Le Harness Engineering demande :
Quel système permet au modèle d'agir, de vérifier son travail, de récupérer après un échec et d'opérer en toute sécurité ?
1PROMPT2-> instruction34CONTEXTE5-> vue de travail67HARNESS8-> environnement d'exploitation910BOUCLE11-> correction locale1213GRAPHE14-> coordination
Les modèles continueront de changer.
L'avantage durable se construit autour d'eux.
Vos contrats s'améliorent.
Vos outils s'améliorent.
Vos tests s'améliorent.
Votre état devient plus propre.
Vos permissions deviennent plus sûres.
Votre logique de récupération devient plus intelligente.
Vos échecs se transforment en infrastructure.
C'est ainsi que des modèles performants deviennent des agents fiables.
C'est ça, le Harness Engineering.
Si vous êtes arrivé jusqu'ici
Mettez ce guide en favoris.
Suivez-moi sur X : x.com/0xjmori
Abonnez-vous à mon Substack : substack.com/@lunarresearcher
Envoyez cet article à quelqu'un qui essaie encore de corriger chaque échec d'agent avec un prompt plus long.



![[Excuses] Je ne recommande plus le freelancing pour l'indépendance.](/cdn-cgi/image/width=1920,quality=90,format=auto,metadata=none/https%3A%2F%2Fcms-assets.youmind.com%2Fmedia%2F1790615558140_ndvona_HTQ9s6laYAAX4J7.jpg)

