---
title: "La boucle Ralph : comment une ligne de bash est entrée dans le modèle"
description: Les agents de code s’arrêtaient avant la fin du travail, alors on les a enfermés dans une boucle bash qui les relançait sur le même prompt. Cette astuce, la boucle Ralph, est ensuite entrée dans les outils sous forme de commande goal, puis dans les modèles. Comment elle fonctionne, et comment Claude Code et Codex la gèrent aujourd’hui.
date: 2026-11-11
tags: agents de code IA, boucle Ralph, loop engineering, Claude Code, Codex
---

« Les modèles d’avant ne comprenaient pas ce que voulait dire “terminé” », a dit Raj, de l’équipe IA appliquée d’OpenAI, au DevDay 2026. Ils avançaient bien, puis rendaient la main trop tôt. La solution a changé de place trois fois : d’abord une boucle bash autour de l’agent, appelée la boucle Ralph, puis une commande goal dans l’outil, et maintenant une persévérance apprise par le modèle lui-même.

Si vous faites tourner des agents de code, il vaut la peine de savoir laquelle de ces trois couches fait le travail aujourd’hui. Sinon, vous écrivez une boucle que votre modèle ou votre outil fait déjà tourner pour vous, et vous la payez deux fois.

La conférence s’appelle [What Comes After Loops?](https://www.youtube.com/watch?v=nAubbmlhPfI), 24 minutes en anglais, par Raj et Eric d’OpenAI. C’est OpenAI qui raconte l’histoire de son propre produit, Codex. J’ai donc regardé l’autre côté aussi : comment Claude Code, l’outil d’Anthropic, gère le même problème.

## La première solution, c’était taper « continue »

Avant que les outils aient une réponse, la réponse, c’était vous. L’agent s’arrêtait, vous tapiez « continue », et il repartait pour un moment.

Raj a montré un post de Peter Steinberger, le créateur d’OpenClaw. Pour garder son agent au travail, il mettait en file toute une pile de messages « continue », l’un après l’autre. Tout le monde faisait une version de ça.

La conférence appelle cela une « boucle externe » : quelque chose en dehors de l’agent qui le relance jusqu’à ce qu’il ait fini. Le modèle ne sait pas quand s’arrêter, alors une personne, ou un script, décide à sa place.

<figure class="fd-fig kf" aria-labelledby="lp1-cap" data-desc="La boucle externe à la main, en trois étapes. Un, travailler : l’agent avance bien sur la tâche. Deux, en rouge, s’arrêter : il rend la main avant la fin du travail. Trois, relancer : vous tapez continue, ou vous en mettez toute une pile en file. Puis retour à l’étape un, jusqu’à ce que le travail soit vraiment fini.">
<p class="kf-kick">Les tâches longues, avant l’aide des outils</p>
<p class="kf-title">L’agent s’arrêtait trop tôt, <em class="is-alert">alors on tapait continue</em></p>
<ol class="kf-steps">
<li><b>Travailler</b><span>L’agent avance bien sur la tâche.</span></li>
<li class="is-alert"><b>S’arrêter</b><span>Il rend la main avant la fin du travail.</span></li>
<li><b>Relancer</b><span>Vous tapez « continue », ou vous en mettez une pile en file.</span></li>
</ol>
<p class="kf-loop">Puis retour à l’étape 1, jusqu’à ce que le travail soit vraiment fini</p>
<figcaption id="lp1-cap">La boucle externe telle que la conférence la décrit. Le schéma est de moi.</figcaption>
</figure>

## Une boucle bash qui n’abandonne jamais

La boucle Ralph, c’est la même relance, écrite en script. Geoffrey Huntley l’a rendue populaire en juillet 2025, dans un article intitulé [Ralph Wiggum as a "software engineer"](https://ghuntley.com/ralph/). Ralph Wiggum, c’est l’enfant des Simpson qui ne réussit jamais rien et n’arrête jamais d’essayer.

Dans sa forme la plus pure, c’est une ligne de bash :

```bash
while :; do cat PROMPT.md | claude-code ; done
```

La boucle lit un fichier de prompt et le donne à un agent de code. L’agent travaille jusqu’à ce qu’il s’arrête. Puis la boucle le relance, avec le même prompt, sans fin. Cette ligne n’a aucune condition de sortie.

Quatre idées la font fonctionner, et elles sont plus intéressantes que la boucle elle-même :

- Une mémoire vide à chaque passage. Chaque passage démarre avec une fenêtre de contexte vide, le texte que le modèle voit d’un coup. Aucun long historique ne la remplit ni ne fait sortir l’objectif.
- Les fichiers se souviennent. L’avancement vit sur le disque : le code, un dossier de spécifications, une par fichier, et un fichier de plan que Huntley appelle `fix_plan.md`. Chaque passage les lit pour savoir où on en est.
- Une seule chose par passage. La règle de Huntley : demandez à Ralph une seule chose par boucle. « Une seule. »
- Les tests résistent. Après chaque changement, l’agent lance les tests de cette partie du code. Un test qui échoue rejette un mauvais changement avant que le passage suivant construise dessus. Huntley appelle cela la contre-pression (backpressure).

Il ne cache pas ce que c’est. Il décrit la technique comme « déterministiquement mauvaise dans un monde non déterministe » : elle échoue de façon prévisible, donc on peut corriger ses échecs dans le prompt. Elle demande aussi « beaucoup de foi », parce que le code converge lentement, passage après passage.

<figure class="fd-fig kf" aria-labelledby="lp2-cap" data-desc="Un passage d’une boucle Ralph, en quatre étapes. Un, lire : le prompt, le plan et les spécifications, avec un contexte vide. Deux, faire une seule chose : une tâche du plan. Trois, tester : les tests rejettent un mauvais changement avant que le passage suivant construise dessus. Quatre, en bleu, l’écrire : commiter le code et mettre à jour le fichier de plan. Puis la boucle bash relance l’agent, avec une mémoire vide.">
<p class="kf-kick">Un passage d’une boucle Ralph</p>
<p class="kf-title">Chaque passage part de zéro, <em>les fichiers se souviennent</em></p>
<ol class="kf-steps">
<li><b>Lire</b><span>Le prompt, le plan et les spécifications. Le contexte est vide.</span></li>
<li><b>Une seule chose</b><span>Une tâche du plan, pas plus.</span></li>
<li><b>Tester</b><span>Un test qui échoue rejette un mauvais changement avant le passage suivant.</span></li>
<li class="is-key"><b>L’écrire</b><span>Commiter le code, mettre à jour le fichier de plan.</span></li>
</ol>
<p class="kf-loop">Puis la boucle relance l’agent, avec une mémoire vide</p>
<figcaption id="lp2-cap">D’après l’article de Geoffrey Huntley, juillet 2025. Les quatre étapes sont mon résumé de son prompt.</figcaption>
</figure>

## L’objectif est entré dans l’outil

L’étape suivante a été de mettre la boucle dans l’outil. OpenAI a ajouté une commande `/goal` à Codex, sortie avec Codex CLI 0.128 fin avril. Raj y voit le « loop engineering » intégré au produit.

Pour comprendre ce que ça apporte, il faut un mot de plus : la compaction. Quand la fenêtre de contexte se remplit, l’outil demande au modèle de résumer l’historique, et le travail repart de ce résumé. Ça garde une longue tâche en vie, mais chaque résumé peut perdre un détail. Après trois ou quatre compactions, les instructions de départ ont pu disparaître.

Un goal évite ça. Vous donnez un objectif à Codex, et l’outil le range en dehors de la conversation, là où la compaction ne peut pas le toucher. L’outil suit son état et vérifie après chaque tour si l’agent a fini. Sinon, il le relance.

L’agent peut aussi dire qu’il est bloqué. Face à un vrai blocage, il le signale et s’arrête, au lieu de tourner en rond sur un problème qu’il ne peut pas résoudre. La boucle bash n’a aucun moyen de faire ça.

<figure class="fd-fig kf" aria-labelledby="lp3-cap" data-desc="La boucle bash face à un goal dans l’outil, en quatre lignes. Mémoire : la boucle bash repart de zéro à chaque passage ; un goal garde une seule session, compactée à mesure qu’elle grandit. L’objectif : la boucle bash lit un fichier de prompt à chaque passage ; un goal est rangé par l’outil, hors du contexte, donc la compaction ne peut pas l’effacer. Fini quand : pour la boucle bash, quand vous l’arrêtez ; pour un goal, quand une vérification après chaque tour le dit. Bloqué : la boucle bash continue de tourner ; un goal signale le blocage et s’arrête.">
<p class="kf-kick">La boucle bash face à une commande goal</p>
<p class="kf-title">Un goal garde l’objectif <em>hors de portée de la compaction</em></p>
<div class="kf-swap is-3">
<p class="kf-swap-h"><small></small><span>La boucle bash</span><span>Un goal dans l’outil</span></p>
<p><small>Mémoire</small><span>Vide à chaque passage</span><em>Une session, compactée à mesure</em></p>
<p><small>L’objectif</small><span>Un fichier de prompt, relu à chaque passage</span><em>Rangé par l’outil, hors du contexte</em></p>
<p><small>Fini quand</small><span>Vous l’arrêtez</span><em>Une vérification après chaque tour le dit</em></p>
<p><small>Bloqué</small><span>Elle continue de tourner</span><em>Il signale le blocage et s’arrête</em></p>
</div>
<figcaption id="lp3-cap">Le goal de Codex tel que décrit dans la conférence, face à la boucle d’une ligne de Huntley.</figcaption>
</figure>

## Puis la persévérance est entrée dans le modèle

La dernière étape, dit OpenAI, a rendu la boucle inutile. Avec GPT-5.6, OpenAI a appris la persévérance au modèle lui-même. Le modèle vérifie son propre travail et continue jusqu’à ce que la tâche soit finie, sans goal et sans « continue ».

Raj a cité deux utilisateurs. Tobi Lütke, qui dirige Shopify, a dit que c’était le premier modèle qui n’avait plus besoin de `/goal`. Ethan Mollick, professeur à Wharton, a laissé Codex utiliser son ordinateur et jouer au jeu Slay the Spire 2 pendant environ cinq heures d’affilée. Ce sont les exemples d’OpenAI, sur la scène d’OpenAI.

Le mécanisme derrière est la partie intéressante. OpenAI regarde ce que les gens ajoutent au harnais, le code autour du modèle qui lance ses outils et gère son contexte. Puis l’entreprise apprend ce comportement au modèle suivant. La compaction a suivi le même chemin : d’abord un appel que fait l’outil, puis une compétence apprise par le modèle, qui sait repartir de son propre résumé.

Anthropic raconte une histoire proche de son côté. Au lancement de Claude Sonnet 4.5, en septembre 2025, l’entreprise a dit avoir vu le modèle garder sa concentration plus de 30 heures sur des tâches complexes. En novembre 2025, ses ingénieurs ont expliqué [comment ils font travailler Claude sur plusieurs fenêtres de contexte](https://www.anthropic.com/engineering/effective-harnesses-for-long-running-agents). Ils nomment le même défaut : « Claude crie victoire sur tout le projet trop tôt. »

Leur solution ressemble beaucoup à Ralph. Un premier agent écrit une liste de plus de 200 fonctionnalités, toutes marquées en échec, plus un fichier d’avancement. Chaque session suivante travaille sur une seule fonctionnalité, commite, et écrit un résumé pour la suivante. Les agents peuvent seulement changer l’état d’une fonctionnalité, jamais la supprimer, donc personne ne peut déclarer finie une fonctionnalité absente.

<figure class="fd-fig kf" aria-labelledby="lp4-cap" data-desc="Où vit le continue, en trois couches, de l’extérieur vers l’intérieur. Votre script : une boucle bash relance l’agent sur le même prompt, la boucle Ralph de juillet 2025. L’outil : une commande goal range l’objectif et vérifie après chaque tour, comme dans Codex et Claude Code. En bleu, le modèle : la persévérance apprise, le modèle vérifie son travail et continue, ce qu’OpenAI annonce pour GPT-5.6. Sous les couches : chaque couche a repris le travail de celle qui l’entoure.">
<p class="kf-kick">Où vit le « continue »</p>
<p class="kf-title">La boucle est rentrée, <em>de votre script jusqu’au modèle</em></p>
<ol class="kf-stack is-nest">
<li><small>Votre script</small><span>Une boucle bash relance l’agent sur le même prompt. La boucle Ralph, juillet 2025.</span></li>
<li><small>L’outil</small><span>Une commande goal range l’objectif et vérifie après chaque tour. Codex et Claude Code.</span></li>
<li class="is-key"><small>Le modèle</small><span>La persévérance apprise : il vérifie son travail et continue. Ce qu’OpenAI annonce pour GPT-5.6.</span></li>
</ol>
<p class="kf-note">Chaque couche a repris le travail de celle qui l’entoure.</p>
<figcaption id="lp4-cap">Mon résumé de l’histoire racontée dans la conférence. GPT-5.6 est une annonce d’OpenAI, pas un test indépendant.</figcaption>
</figure>

## Comment Claude Code et Codex la gèrent aujourd’hui

Les deux outils ont maintenant les trois couches, et ils ont construit celle du milieu de façon différente.

Commençons par la boucle bash. Anthropic publie un [plugin Ralph Loop](https://claude.com/plugins/ralph-loop) officiel pour Claude Code. Vous lancez `/ralph-loop "votre prompt" --max-iterations 10 --completion-promise "DONE"`. Un stop hook, un petit script qui se lance chaque fois que Claude veut s’arrêter, intercepte la sortie et redonne le même prompt. Il s’arrête quand Claude écrit le mot choisi, ou au plafond d’itérations.

Il y a une vraie différence avec l’original. Le plugin garde la même session, alors que la boucle de Huntley repart avec une mémoire vide à chaque passage. Huntley lui-même met sur sa page le lien d’une vidéo intitulée « why the claude code plugin isn’t it ». Avec Codex, on écrit encore la boucle à la main, avec `codex exec`, son mode non interactif, dans le `while`.

Ensuite, le goal. Les deux outils ont maintenant une commande `/goal`, et ils ne la vérifient pas de la même façon :

- Codex. Le goal est un état que l’outil garde pour la conversation. L’application montre son avancement au-dessus de la zone de saisie, avec des boutons pour le mettre en pause, le reprendre, le modifier ou l’effacer. Le modèle signale lui-même quand il est bloqué.
- Claude Code. Vous écrivez une condition, jusqu’à 4 000 caractères. Après chaque tour, un modèle séparé lit la conversation et répond : pas encore, atteint, ou impossible. La documentation précise que ce vérificateur « ne lance pas de commandes et ne lit pas de fichiers » de lui-même.

Ce dernier détail change la façon d’écrire un goal pour Claude Code. Le vérificateur ne voit que ce que montre la conversation. « Les tests passent » est faible. « `npm test` passe et sa sortie est affichée » est une condition qu’il peut vraiment vérifier. La documentation propose aussi une porte de sortie, écrite dans la condition elle-même : « or stop after 20 turns », arrête-toi après 20 tours.

Claude Code ajoute une chose que Codex n’a pas sous ce nom : `/loop`. Elle relance un prompt selon un rythme, toutes les cinq minutes par exemple, ou à un rythme que Claude choisit, entre une minute et une heure. C’est fait pour surveiller quelque chose, comme un déploiement, pas pour finir une tâche.

<figure class="fd-fig kf" aria-labelledby="lp5-cap" data-desc="Claude Code et Codex comparés sur quatre lignes, sans côté mis en avant. La boucle bash : Claude Code a un plugin Ralph Loop officiel, où un stop hook redonne le prompt ; pour Codex, on l’écrit soi-même, avec codex exec dans une boucle while. Un goal : dans Claude Code, une condition qu’un modèle séparé vérifie après chaque tour ; dans Codex, un objectif que l’outil garde, avec pause, reprise, modification et effacement. Selon un rythme : Claude Code a la commande loop, toutes les quelques minutes ou à son rythme ; pour Codex, pas couvert ici. Les aides : Claude Code a des sous-agents qui rendent compte, et des équipes d’agents qui s’écrivent, encore expérimentales ; Codex a des sous-agents, activés par défaut, avec la commande subagents pour passer de l’un à l’autre.">
<p class="kf-kick">Claude Code et Codex, novembre 2026</p>
<p class="kf-title">Les mêmes couches, <em>des vérifications différentes</em></p>
<div class="kf-swap is-3 is-even">
<p class="kf-swap-h"><small></small><span>Claude Code</span><span>Codex</span></p>
<p><small>La boucle bash</small><span>Plugin Ralph Loop officiel : un stop hook redonne le prompt</span><span>À écrire soi-même : codex exec dans une boucle while</span></p>
<p><small>Un goal</small><span>Une condition qu’un modèle séparé vérifie après chaque tour</span><span>Un objectif que l’outil garde : pause, reprise, modification, effacement</span></p>
<p><small>Selon un rythme</small><span>/loop : toutes les quelques minutes, ou à son rythme</span><span>Pas couvert ici</span></p>
<p><small>Les aides</small><span>Des sous-agents qui rendent compte. Des équipes d’agents qui s’écrivent, encore expérimentales</span><span>Des sous-agents, activés par défaut, et /subagents pour passer de l’un à l’autre</span></p>
</div>
<figcaption id="lp5-cap">D’après la documentation de Claude Code et de Codex, lue le 11 novembre. Codex a aussi des tâches planifiées, que je n’ai pas regardées.</figcaption>
</figure>

## N’ajoutez des agents que si le travail le demande

Une fois qu’un agent continue tout seul, la question suivante est la vitesse : pourquoi pas dix agents ? La réponse d’Eric, dans la deuxième moitié de la conférence : attendez. Commencez avec un seul agent, donnez-lui une tâche claire et un moyen de vérifier son travail. Pour beaucoup de tâches, ça suffit.

N’en ajoutez que quand le travail se découpe tout seul. Relire cinq pull requests se découpe facilement : un agent d’appoint par pull request, chacun avec son propre contexte. Une race condition difficile est moins évidente, mais deux agents d’appoint peuvent chercher à deux endroits en même temps.

Le coût est réel. Chaque agent ajouté peut faire monter beaucoup la facture de tokens, sans rendre le travail plus rapide ni meilleur. Les deux éditeurs le disent dans leur documentation : les sous-agents de Codex « consomment plus de tokens », et les équipes d’agents de Claude Code en utilisent « nettement plus qu’une seule session ».

Eric a aussi nommé un piège, qu’il appelle la taxe du middle management. Chaque règle que vous ajoutez sur la façon dont les agents doivent travailler ensemble, et ils se mettent à attendre des validations dans des hiérarchies qui n’existent pas. Gardez donc une organisation simple. Si vous ne savez pas dire pourquoi un agent est là, retirez-le.

À l’autre bout de l’échelle, Raj a dit qu’OpenAI avait fait tourner 10 000 agents sur un célèbre problème ouvert de mathématiques, les équations de Navier-Stokes. Il a donné 2,7 millions de messages et environ 130 milliards de tokens en sortie. C’est le compte rendu d’OpenAI sur son propre modèle interne, et personne à l’extérieur ne l’a encore vérifié. Pour une équipe au travail, la leçon utile est celle d’avant : un seul agent d’abord.

<figure class="fd-fig kf" aria-labelledby="lp6-cap" data-desc="Trois façons de staffer une tâche, en cartes. En bleu, un seul agent : une tâche claire et un moyen de vérifier son travail, là où s’arrêtent la plupart des tâches. Des aides : des morceaux indépendants, par exemple un agent par pull request à relire, chacun rend compte. Une équipe : des morceaux qui doivent se parler, les agents s’écrivent, et le plus de tokens.">
<p class="kf-kick">Combien d’agents pour une tâche</p>
<p class="kf-title">Commencez avec <em>un agent et un moyen de vérifier</em></p>
<div class="kf-cards">
<div class="is-key"><small>Un seul agent</small><b>Une tâche et une vérification</b><span>Une tâche claire et un moyen de vérifier le travail. La plupart des tâches s’arrêtent là.</span></div>
<div><small>Des aides</small><b>Des morceaux qui se séparent</b><span>Un agent par pull request à relire, chacun rend compte.</span></div>
<div><small>Une équipe</small><b>Des morceaux qui se parlent</b><span>Les agents s’écrivent pendant le travail. Le plus de tokens.</span></div>
</div>
<figcaption id="lp6-cap">Le conseil d’Eric dans la conférence, avec les deux sortes d’aides que proposent les deux outils.</figcaption>
</figure>

## Un journal court garde l’objectif

Le dernier conseil d’Eric est celui que j’essaierais en premier, parce qu’il marche avec n’importe quel outil. En regardant un agent travailler, on ajoute sans cesse de petites consignes oubliées dans le premier prompt. Après quelques compactions, l’agent peut s’éloigner de ce premier prompt, qui portait l’essentiel du contexte sur l’objectif.

Sa solution : demander à l’agent de tenir un journal de travail court. Il contient trois choses. L’objectif global. Le travail en cours. Et la façon dont votre dernière consigne s’accorde avec les deux.

Gardez-le court exprès. Un journal qui note chaque test raté devient un carnet que personne ne lit, et il remplit à nouveau le contexte. C’est la même idée que le fichier de plan de Ralph, tenu par l’agent à l’intérieur d’une seule longue session.

Il a conclu sur un avertissement qui va bien à toute cette note : les bonnes pratiques ont une date de péremption, alors ne vous attachez pas à votre façon de travailler. La boucle bash était la bonne pratique il y a un an.

<figure class="fd-fig kf" aria-labelledby="lp7-cap" data-desc="Le journal de travail que propose Eric, en trois parties. En bleu, l’objectif global : à quoi sert toute la tâche. Le travail en cours : ce qui avance maintenant. Votre dernière consigne : comment elle s’accorde avec les deux. Sous les parties : court exprès, pas un carnet de chaque test raté.">
<p class="kf-kick">Un journal de travail, en trois parties</p>
<p class="kf-title">Écrivez-le, pour que <em>l’objectif survive à la compaction</em></p>
<ol class="kf-stack">
<li class="is-key"><small>L’objectif global</small><span>À quoi sert toute la tâche.</span></li>
<li><small>Le travail en cours</small><span>Ce qui avance maintenant.</span></li>
<li><small>Votre dernière consigne</small><span>Comment elle s’accorde avec les deux.</span></li>
</ol>
<p class="kf-note">Court exprès : pas un carnet de chaque test raté.</p>
<figcaption id="lp7-cap">D’après la conférence. Les trois parties sont celles d’Eric.</figcaption>
</figure>

## À essayer

La boucle Ralph arrive vers 7:10 dans la vidéo, `/goal` juste après, et les conseils d’Eric sur les agents vers 11:00.

- OpenAI, [What Comes After Loops?](https://www.youtube.com/watch?v=nAubbmlhPfI), DevDay 2026, 24 minutes, en anglais.
- Geoffrey Huntley, [Ralph Wiggum as a "software engineer"](https://ghuntley.com/ralph/), l’article d’origine.
- Anthropic, [Effective harnesses for long-running agents](https://www.anthropic.com/engineering/effective-harnesses-for-long-running-agents), la liste de fonctionnalités et le fichier d’avancement.
- Documentation de Claude Code : [/goal](https://code.claude.com/docs/en/goal), [/loop](https://code.claude.com/docs/en/scheduled-tasks), [les équipes d’agents](https://code.claude.com/docs/en/agent-teams), et le [plugin Ralph Loop](https://claude.com/plugins/ralph-loop).
- Documentation de Codex : [les commandes slash, dont /goal](https://learn.chatgpt.com/codex/reference/slash-commands), et [les sous-agents](https://learn.chatgpt.com/codex/agent-configuration/subagents).
- [Forkez le harnais de votre agent, gardez le meilleur](/fr/notes/fork-your-agents-harness.html), sur l’amélioration du code autour du modèle.
- [TokenOps : pourquoi un agent à 40 tours coûte 16×, et pas 4×](/fr/notes/tokenops-agent-cost-curve.html), sur ce que coûtent les longues sessions.

Avant d’écrire votre propre boucle, regardez ce que votre outil et votre modèle font déjà. Donnez un goal à une tâche, avec une condition que le vérificateur peut voir, comme une commande de test et sa sortie. Puis dites-moi où il s’est arrêté, et pourquoi.
