chimera-carry-the-failure-forward
Une boucle de réessai qui écrase sa variable de feedback ne montre à la tentative 3 que l'échec de la tentative 2 — elle redérive donc le patch que la tentative 1 avait déjà essayé.
Conférée par la personne qui a relu la fiche, et non revendiquée par le fichier lui-même. Une fiche que l'agent distille au cours d'une exécution ayant consommé du contenu non fiable naît contaminée et reste en attente de relecture avant d'être un jour récupérée.
Quand elle vient à l'esprit
- écrire une boucle de retry
- l'agent retente toujours le même correctif
- renvoyer la sortie du vérificateur au modèle
- les tentatives échouent toujours pareil
- restaurer le workspace entre les tentatives
C'est dans À éviter et Vérifier que se trouve d'ordinaire la valeur. À faire est la section que tout le monde écrit.
Le corps de la fiche ci-dessus est une traduction. L'original anglais est ce que la CLI importe, ce que l'agent lit à l'exécution et ce que l'empreinte ci-dessous atteste.
Déclencheur
Vous avez une boucle qui lance une tentative, la juge, et en lance une autre avec du feedback : un agent doté d'un vérificateur, un correcteur de code face à une suite de tests, un pipeline générer-puis-vérifier. Le budget dépasse deux tentatives, et l'espace de travail est restauré entre elles pour que chaque tentative démarre propre.
Cela ne s'applique pas à un réessai idempotent sur un transport instable — un appel réseau qui a échoué pour des raisons sans rapport avec ce que vous avez envoyé. Il n'y a rien à apprendre de la tentative 1 dans ce cas, et la transporter n'est que de la charge inutile.
À faire
- Stockez les tentatives dans une liste, pas dans une variable que vous réaffectez. Un enregistrement par tentative : la sortie du vérificateur, le patch que la tentative a réellement écrit, et quelle étape d'outil a échoué en premier.
- Prenez le patch depuis l'instantané de l'espace de travail, avant la restauration — le vrai diff, pas la description que le modèle donne de ce qu'il a changé. C'est la restauration qui rend cela nécessaire : une fois l'arbre revenu en arrière, plus rien sur le disque ne conserve non plus la mauvaise piste, et la tentative suivante n'a donc aucun obstacle pour la redériver à l'identique.
- Composez le prompt de réessai à partir de tous les enregistrements, du plus ancien au plus récent, chacun étiqueté avec son numéro de tentative et son verdict, sous un titre indiquant que ces pistes ont déjà été essayées puis annulées.
- Bornez chaque enregistrement. Chimera plafonne un diff réinjecté à 2000 caractères et le tronque avec un marqueur ; un historique de trois tentatives sans borne dominera le prompt.
- Dédupliquez par signature d'échec. Si deux tentatives ont échoué de la même façon, gardez-en une et notez que l'échec s'est répété — la répétition est le signal, la seconde copie n'apporte aucune information nouvelle.
- Quand la signature se répète, arrêtez d'ajouter et changez quelque chose de structurel : replanifiez en donnant les
causes accumulées comme contexte au planificateur (
TaskLedger.context()les rend sous « Why earlier attempts failed (do NOT repeat these): »), ou passez à un modèle plus puissant. Plus de feedback sur la même impasse ne fait pas sortir de l'impasse. - Émettez un événement comptable à chaque injection d'historique, pour qu'un bras de benchmark puisse prouver que l'injection a bien eu lieu.
À éviter
L'écrasement. Dans chimera/core/autonomous.py, le feedback de la boucle est reconstruit à chaque tour :
feedback = "\n\n".join(p for p in (fb, _verify_fb) if p) or "The attempt did not pass verification."
si bien que la tentative 3 est composée avec l'échec de la tentative 2 et rien de la tentative 1. La transporter signifie plutôt ajouter à une structure — esquissé, pas cité, parce que la version qui accumule est ce que cette carte défend, et non ce que le fichier fait aujourd'hui :
records.append(record_for(index, verdict, patch)) # one entry per attempt
feedback = render(records) # every attempt, oldest first
Soyez précis sur la moitié déjà en place au moment où vous lisez ceci dans Chimera : le contenu du
feedback est bien couvert — --diff-feedback montre au réessai le patch qu'il a réellement écrit
(chimera/core/autonomous.py, plafonné à _DIFF_FEEDBACK_MAX_CHARS = 2000), et TaskLedger
accumule les causes pour le planificateur. Ce qui n'est pas couvert, c'est l'accumulation d'une tentative à l'autre dans la
ligne ci-dessus. Une carte qui présenterait l'ensemble comme manquant argumenterait contre un travail déjà fait.
Évitez aussi de dire au réessai *qu'*il a échoué sans lui montrer *ce qu'*il a écrit. « The attempt did not pass verification » plus un test en échec suffit à faire réessayer un modèle et ne suffit pas à lui faire essayer autre chose — le mauvais patch lui est invisible et l'espace de travail ne le contient plus, si bien que le redériver est le chemin de moindre résistance.
Et évitez de ne transporter que la prose du gestionnaire en laissant tomber la sortie du vérificateur. L'assertion en échec est la ligne la plus exploitable de toute la boucle ; le paragraphe d'un relecteur à son sujet en est une paraphrase strictement moins informative.
Vérifier
Instrumentez le composeur, lancez une tâche dont vous savez qu'elle échoue trois fois, et cherchez dans le prompt de la tentative 3 une chaîne qui n'existe que dans la tentative 1 — un nom de fichier qu'elle a touché, un identifiant issu de son diff. Présente ou absente ; il n'y a pas de demi-mesure.
Deuxième vérification, tout aussi binaire : comptez les injections. Une exécution où l'historique n'a jamais été assemblé parce que la garde était fausse, ou parce que la liste des diffs était vide, n'a rien mesuré du tout — et un bras de benchmark bâti là-dessus mesure la plomberie, pas l'idée. Si le compteur affiche zéro, le résultat est nul, quoi que dise le taux de réussite.
Risque
L'ancrage est la contre-hypothèse enregistrée, pas une hypothèse en l'air : montrer à un modèle le mauvais patch
peut fixer son attention sur ce patch et produire des variations d'une approche morte plutôt qu'une approche
différente. C'est pourquoi le comportement est optionnel et mesuré dans Chimera (--diff-feedback) plutôt
qu'activé par défaut. Traitez-le comme une affirmation à tester sur vos propres tâches, pas comme une amélioration acquise.
Le second coût est le budget de contexte. Trois diffs, trois vidages de vérificateur et une revue de gestionnaire peuvent pousser le prompt au-delà de son seuil de compaction — et un compacteur sans restauration supprimera alors exactement l'historique accumulé que vous avez payé pour construire. Bornez les enregistrements et connaissez votre budget avant d'activer ceci, sinon les deux mécanismes se combattront et le symptôme visible ne sera ni l'un ni l'autre.
L'utiliser
La fiche est une donnée. Clonez le dépôt et importez-la par son chemin — ce qui arrive par le réseau est traité comme contaminé et retenu pour approbation, ce qui est le comportement souhaitable et la raison pour laquelle il n'y a pas d'installateur en une ligne ici.
git clone https://github.com/brcampidelli/chimera-agent.gitchimera skills-import chimera-agent/skills/chimera-carry-the-failure-forward/SKILL.mdIntégrité
SHA-256 du fichier tel qu'il est publié. Qui l'importe peut vérifier que ce qu'il a reçu correspond à ce que cette page affichait.
62dcc2aa830e5eb35c554bebf2c1a24454a054bf17bf152ccd59f3497b5e043d