Aller au contenu principal

Harness : contrôler l’exécution d’un agent

Quand un modèle dit « lance npm test », aucun test ne démarre pour autant. Ce qui l’exécute vraiment, c’est le logiciel qui entoure le modèle : le harness, ou plan de contrôle. Imaginons un harness qui traite cette demande ainsi. Il vérifie d’abord que npm test figure dans sa liste de commandes autorisées, puis le lance dans un sous-processus limité à cinq minutes. À la fin, il renvoie au modèle le code de sortie et les 200 dernières lignes de sortie, et inscrit le même enregistrement dans son journal. Si le processus plante en cours de route, la tentative suivante repart de cette entrée du journal.

Dans cette seule étape, le modèle n’a fait que proposer le prochain mouvement ; le harness l’a rendu exécutable, l’a maintenu dans ses limites, en a gardé une trace consultable et l’a rendu récupérable après une erreur. Un harness est donc plus qu’une fenêtre de dialogue : il relie modèle, dépôt, terminal, permissions et vérifications.

Un harness prend en charge au moins huit choses​

Le tableau suivant applique les huit responsabilités à la même demande npm test.

CoucheResponsabilitéCe qu’elle fait pour npm test
BoucleAlterner tours du modèle, appels d’outils, résultats et arrêtRenvoyer le résultat des tests pour que le modèle choisisse la suite ; s’arrêter quand les tests passent ou que le budget d’étapes est épuisé
ContexteChoisir instructions, historique, fichiers et preuvesNe mettre dans le contexte que les 200 dernières lignes, pas tout le journal
OutilsValider les arguments, exécuter et structurer les résultatsVérifier la commande et le répertoire de travail, renvoyer code de sortie et sortie ; un sous-processus hérite des variables d’environnement et des ressources ouvertes de son parent (voir Processus, espaces d’adressage et mémoire), il faut donc décider d’abord ce qu’il peut emporter
PolitiqueImposer portée, permissions, approbations, budgets et sécuritéConsulter la liste autorisée : npm test peut tourner directement, une commande qui supprime un répertoire ou pousse du code doit s’arrêter et demander à une personne
ÉtatConserver progression, artefacts et checkpoints récupérablesNoter que cette étape a lancé les tests et avec quel résultat, pour reprendre ici après un plantage
FiabilitéGérer timeouts, reprises, idempotence, annulation et erreursArrêter le processus au bout de cinq minutes ; relancer les tests ne modifie rien, la reprise est donc sans risque
ObservabilitéConserver traces, logs, tokens, coûts et preuves d’outilsJournaliser commande, durée et code de sortie, pour savoir ensuite ce qui a tourné et quand
ÉvaluationTester le résultat sur des tâches représentatives, pas seulement le discoursVérifier que les tests passent réellement, pas que le modèle a l’air d’avoir fini

Un « tous les tests passent » du modèle ne compte pas : un harness fiable lit lui-même le code de sortie de npm test, puis décide d’arrêter ou non. La façon de brancher ce type de validation externe dans la boucle est décrite dans Boucles d’agent bornées.

Concevoir un harness dans cet ordre​

  1. Définir le résultat et un contrôle externe de réussite, par exemple « npm test se termine avec le code 0 ».
  2. Exposer le plus petit ensemble d’outils utile. Un petit modèle local dépend encore plus de cette étape : tours courts, outils peu nombreux, sorties plafonnées.
  3. Séparer lectures, écritures et actions irréversibles.
  4. Conserver artefacts et preuves hors de la conversation.
  5. Fixer des limites de temps, tokens, reprises et concurrence ; les conditions d’arrêt et le coupe-circuit sont détaillés dans Boucles d’agent bornées.
  6. Tracer tours et appels d’outils tout en protégeant les données sensibles.
  7. Rejouer des tâches représentatives avant de changer de modèle, de harness ou d’effort de raisonnement.

Les contrôles qui décident si un résultat peut être livré, comme les tests, les permissions et la recette de bout en bout, appartiennent au harness et au workflow ; le modèle reste remplaçable. Les modèles et tarifs changeants appartiennent au Radar des modèles et API, et les résultats publics et pièges propres aux outils vont dans Choisir un agent de programmation IA. Un meilleur modèle peut réduire les reprises, mais ne dispense ni des preuves, ni des permissions, ni des contrôles de bout en bout.

Où se trouvent ces contrôles dans Claude Code, Codex et Pi​

Un agent de code installé tel quel implémente déjà l’essentiel de ces responsabilités ; ce que vous réglez, ce sont ses interrupteurs. Le tableau suit la documentation officielle au 2026-10-29, et Pi 1.4.0.

ContrôleClaude CodeCodexPi
Instructions du projetCLAUDE.md ; il sait aussi lire le AGENTS.md du dépôtAGENTS.md : d’abord ~/.codex/AGENTS.md, puis chaque niveau depuis la racine du dépôtAGENTS.md et CLAUDE.md se chargent toujours, quelle que soit la confiance accordée au projet (doc de sécurité)
Permissions et approbation/permissions, ou permissions.allow / ask / deny dans settings.json, évaluées refus → demande → autorisationapproval_policy (par exemple on-request ou never) et /permissions ; approvals_reviewer = "auto_review" confie les approbations à un agent relecteurAucune demande avant les appels d’outils ; --approve / --no-approve décident seulement si les réglages et extensions du projet se chargent
Bac à sableDésactivé par défaut ; on l’active avec /sandbox ou sandbox.enabled ; il n’enveloppe que les commandes shellsandbox_mode : read-only, workspace-write, danger-full-access ; workspace-write n’a pas de réseau par défautPas de bac à sable intégré ; exécuter tout Pi dans un conteneur ou une machine virtuelle
Dossier des skills.claude/skills/<name>/SKILL.md ; skills personnelles dans ~/.claude/skills/.agents/skills, parcouru du répertoire courant jusqu’à la racine du dépôt ; skills personnelles dans $HOME/.agents/skills.agents/skills/, ~/.agents/skills/ et .pi/skills
Configuration MCPclaude mcp add ; pour partager avec l’équipe, l’écrire dans .mcp.json à la racine du projetcodex mcp add, ou une table [mcp_servers.<name>] dans ~/.codex/config.tomlpi mcp add ; ~/.pi/agent/mcp.json, et .pi/mcp.json pour le projet
Hookshooks dans settings.json ; par exemple, PreToolUse peut bloquer un appel d’outil~/.codex/hooks.json ou [hooks] dans config.toml ; le .codex/ du projet doit d’abord être approuvéPas de configuration de hooks à part ; une extension utilise pi.on("tool_call", …) pour bloquer ou réécrire les appels
Exécution sans surveillanceclaude -p "…"codex exec "…", qui tourne par défaut dans un bac à sable en lecture seulepi -p "…", ou --mode json et --mode rpc
Reprendre une sessionclaude -c reprend la plus récente ; claude -r <ID ou nom> reprend une session précisecodex resume --last ; en mode non interactif, codex exec resume --lastpi -c reprend la plus récente ; pi -r ouvre la liste des sessions

Le même mot « bac à sable » ne couvre pas le même terrain chez les trois ; celui de Claude Code, par exemple, peut encore lire ~/.ssh une fois activé. Avant de toucher à quoi que ce soit, lisez la comparaison et la configuration de départ dans Sécurité des agents.

Explorer les liensOuvrir le réseau