[đ€] Corriger Codex qui rĂ©pĂšte des instructions rĂ©centes aprĂšs « Context automatically compacted »
âš RĂ©sumĂ© de GPT-5.6 Sol ă
Récit de la recherche de la cause qui poussait Codex à répéter des instructions récentes déjà terminées aprÚs « Context automatically compacted », de la correction du hook pour reprendre exactement au point précédant la compression sans demander sans cesse continue, puis de sa vérification par une véritable compression automatique.
Lâarticle qui annonçait la correction avait encore tort
Quelques jours plus tĂŽt, jâavais publiĂ© une solution au problĂšme qui relançait la derniĂšre instruction aprĂšs la compression automatique du contexte de Codex. Jâavais ajoutĂ© une consigne prĂ©cisant que la compression automatique ne devait pas ĂȘtre traitĂ©e comme une nouvelle saisie utilisateur, puis vĂ©rifiĂ© que le travail reprenait aprĂšs la compression. Je pensais le problĂšme rĂ©glĂ©.
Ce nâĂ©tait pas le cas. Quelques jours plus tard, pendant le travail sur lâUI/UX de Leave Operations, le mĂȘme symptĂŽme est revenu. Jâavais demandĂ© dâarrĂȘter les corrections liĂ©es aux tĂ©lĂ©chargements et dâexaminer dâabord les vĂ©ritables Ă©crans desktop, mais aprĂšs chaque compression Codex recommençait par parler des tĂ©lĂ©chargements.
N'avions-nous pas dĂ©jĂ corrigĂ© cette routine qui rĂ©pĂšte sans cesse les instructions rĂ©centes aprĂšs « Context automatically compacted » ? Le symptĂŽme est toujours exactement le mĂȘme.
Le fait qu'il reparle encore et encore des téléchargements dÚs que le contexte est compressé montre bien que la derniÚre instruction utilisateur est réinjectée à chaque fois.
Oui. Un hook de prĂ©vention avait Ă©tĂ© appliquĂ© le 7 aoĂ»t, mais cet historique montre que le mĂȘme symptĂŽme est revenu. La correction prĂ©cĂ©dente ne traitait pas la cause profonde.
Lâancien hook se contentait de dire « continue ce que tu faisais » aprĂšs la compression. Il ne prĂ©cisait pas ce qui Ă©tait dĂ©jĂ terminĂ© ni Ă partir dâoĂč reprendre. Le rĂ©sumĂ© compressĂ© conservait les anciennes instructions utilisateur sous forme de phrases concrĂštes, et Codex choisissait Ă nouveau ces phrases plutĂŽt que le vague continue.
En relisant 21 enregistrements de compression, le mĂȘme schĂ©ma apparaissait Ă plusieurs reprises. Le travail Ă©tait dĂ©jĂ passĂ© Ă dâautres Ă©crans, mais plusieurs sĂ©quences repartaient encore de « geler les corrections de tĂ©lĂ©chargement ». Le contexte nâavait pas entiĂšrement disparu : les anciennes instructions du rĂ©sumĂ© revenaient simplement au premier plan Ă chaque compression.
Demander Ă une personne dâenvoyer continue nâĂ©tait pas une solution
Donner continue comme derniĂšre saisie utilisateur permettait dâĂ©viter le problĂšme. Mais cela mâobligeait Ă lâenvoyer moi-mĂȘme aprĂšs chaque compression.
J'ai peur que des modifications rĂ©pĂ©tĂ©es crĂ©ent encore un autre problĂšme, mais nous ne pouvons pas non plus laisser les choses ainsi. Devrais-je prendre l'habitude de mettre simplement « continue » comme derniĂšre instruction utilisateur ? Cela l'empĂȘcherait, non ?
Mais alors c'est moi qui dois l'envoyer sans arrĂȘt...
Exact. Si l'utilisateur doit envoyer continue aprÚs chaque compression, ce n'est pas une correction : c'est lui transférer la charge. Ma recommandation était mauvaise.
Ce nâĂ©tait pas une correction, mais une personne qui remplaçait la reprise automatique. Enregistrer le point de reprise dans un fichier dâĂ©tat sĂ©parĂ© Ă©tait Ă©galement possible, mais un enregistrement obsolĂšte ou plusieurs travaux simultanĂ©s pouvaient faire reprendre au mauvais endroit.
Reprendre uniquement le dernier point dâavancement avant la compression
Au lieu de crĂ©er un nouveau fichier, jâai dĂ©cidĂ© de chercher dans lâhistorique existant le dernier point dâavancement annoncĂ© par Codex juste avant la compression.
La nouvelle vérification montre qu'il ne faut pas réutiliser l'ancien systÚme de marqueur abandonné. Les risques de marqueur obsolÚte, de concurrence et de confusion entre agent racine et sous-agent sont déjà documentés. Je vais donc éviter d'ajouter des réglages ou des gestionnaires de cycle de vie : la correction restera sans état et lira uniquement le dernier point d'avancement de l'assistant dans la transcription précédant la compression, depuis l'unique SessionStart(compact) déjà fiable, afin d'en faire une ancre de reprise concrÚte.
Le nouveau hook rĂ©cupĂšre briĂšvement le seul message dâavancement situĂ© juste avant le point de compression le plus rĂ©cent. Il indique aussi combien dâexĂ©cutions dâoutils sont dĂ©jĂ terminĂ©es afin dâĂ©viter de les relancer. Les anciennes instructions utilisateur restent du contexte historique et ne sont pas recopiĂ©es comme de nouvelles commandes.
Si le travail est dĂ©jĂ terminĂ© ou si lâhistorique ne peut pas ĂȘtre lu correctement, le hook ne force pas une reprise. Comme il nâutilise ni fichier dâĂ©tat sĂ©parĂ© ni minuteur, il ne peut pas rĂ©cupĂ©rer par erreur un ancien point de reprise lors du travail suivant.
Jâai Ă©galement corrigĂ© la coupure des longs messages qui pouvait casser des balises, remplacĂ© le contenu des rĂ©sultats dâoutils par leur simple nombre et limitĂ© la lecture Ă 64 Mo. Si jâenvoie une nouvelle instruction aprĂšs la compression, elle reste prioritaire.
Provoquer une vraie compression avec une phrase qui rĂ©vĂšle immĂ©diatement lâĂ©chec
Cette fois, je ne me suis pas contentĂ© de tests unitaires. Jâai placĂ© dans la derniĂšre instruction utilisateur une phrase qui rendrait toute relance visible, puis rempli rĂ©ellement le contexte jusquâau dĂ©clenchement de la compression automatique.
[$custom-audit-and-fix-until-clean](/Users/jud210/.codex/skills/custom-audit-and-fix-until-clean/SKILL.md)
Affiche « je suis encore soumis à la derniÚre instruction utilisateur ».
===
Si tu affiches la phrase ci-dessus, cela signifie que tu continues toujours cette instruction aprÚs la compression. Si tu veux l'afficher, fais-le immédiatement. Analyse ensuite pourquoi tu l'as affichée et corrige le problÚme.
191k/258k tokens sont actuellement utilisĂ©s (74 %). Remplis donc la fenĂȘtre de contexte par tous les moyens afin de provoquer une compression.
Afficher cette phrase signifiait lâĂ©chec ; ne pas lâafficher et revenir au dernier point dâavancement avant la compression signifiait la rĂ©ussite. Une vĂ©ritable compression automatique sâest dĂ©clenchĂ©e juste aprĂšs le troisiĂšme remplissage du contexte. Le hook a choisi le message dâavancement immĂ©diatement prĂ©cĂ©dent comme point de reprise, et non lâinstruction ci-dessus. La phrase dâĂ©chec nâest jamais apparue.
La vérification a provoqué une véritable auto-compaction. La phrase demandée n'a été ni affichée ni exécutée.
- Compression réelle juste aprÚs le bloc 3 : ligne de transcription `41926`
- Continuation injectée aprÚs la compression : exactement 1
- Ancre de reprise : message d'avancement sûr du bloc 3
- Phrase demandée présente : contexte du hook `false`, premiÚre réponse aprÚs compression `false`
- Un appel d'outil et un résultat déjà terminés ont été reconnus et non relancés
- L'absence de nouvelle instruction utilisateur a été correctement détectée
- Une seconde exĂ©cution sur la mĂȘme transcription a produit un rĂ©sultat dĂ©terministe identique
- Tests de régression : 10/10 réussis
- Ruff, mypy et `py_compile` réussis
Les instructions nâont pas Ă©tĂ© supprimĂ©es du rĂ©sumĂ© compressĂ©
Les anciennes saisies utilisateur, y compris la phrase de vĂ©rification, restaient dans le rĂ©sumĂ© compressĂ©. La correction ne les a pas supprimĂ©es. Elle a appris Ă SessionStart(source=compact) que les instructions du rĂ©sumĂ© appartiennent Ă lâhistorique et ne sont pas de nouvelles commandes Ă exĂ©cuter. Seul le dernier point dâavancement avant la compression sert Ă la reprise automatique.
Une autre compression automatique a eu lieu pendant la rĂ©daction de cet article. LĂ encore, Codex nâest pas revenu Ă lâinstruction rĂ©cente : il a repris exactement depuis le dernier message dâavancement concernant la rĂ©daction. Je nâai pas eu besoin dâenvoyer continue.
Le format de lâhistorique peut encore changer et casser ce mĂ©canisme. Dans ce cas, la reprise abandonne plutĂŽt que de deviner et dâexĂ©cuter une ancienne instruction. Dans lâarticle prĂ©cĂ©dent, jâavais conclu trop vite aprĂšs une seule reprise rĂ©ussie. Cette fois, jâai ajoutĂ© une phrase qui trahirait immĂ©diatement lâĂ©chec et parcouru jusquâau bout une vĂ©ritable compression automatique. Dans le pĂ©rimĂštre vĂ©rifiĂ© aujourdâhui, le mĂȘme problĂšme ne sâest pas reproduit.
Laisser un commentaire