Rejouer une exécution enregistrée
Rejouez un journal et ses commits enregistrés sans envoyer de requête au modèle.
Enregistrer une exécution et la rejouer
Section intitulée « Enregistrer une exécution et la rejouer »Enregistrez une tâche dans un journal, puis utilisez un agent de rejeu pour reproduire ses événements et ses commits enregistrés. Le rejeu n’envoie aucune requête au modèle ; ses champs de consommation reprennent les compteurs d’origine, sans nouvelle consommation.
Les deux branches partent du même commit : les commits rejoués ont donc les mêmes identifiants que les commits enregistrés. Depuis un autre commit qui a le même arbre, les arbres et les messages sont identiques mais les identifiants diffèrent.
Enregistrer une exécution rejouable
Section intitulée « Enregistrer une exécution rejouable »logging: { replayable: true } ajoute un événement workspace-commits au journal à la fin d’un dispatch en sandbox, y compris en échec ou annulé.
Référence API : WorkspaceCommitsEvent.
Quand l’historique ne peut pas être enregistré, l’événement garde la baseline, donne la raison dans unavailable, et le dispatch émet un avertissement. Le résultat du dispatch ne change jamais. C’est le cas avec :
- des commits de merge, ou un historique réécrit depuis la baseline ;
- plus de 8 Mio de patchs et de messages ;
- un message de commit dans un autre encodage qu’UTF-8 ;
- un patch qui ne reproduit pas l’arbre de son commit.
Ce que fait un rejeu
Section intitulée « Ce que fait un rejeu »Passez le journal à createReplayAgent() et utilisez le résultat comme agent d’un dispatch() avec le même brief. Le rejeu avance tour par tour, dans l’ordre de l’enregistrement.
Les commits sont reconstruits via la sandbox : le rejeu fonctionne donc aussi avec les sandboxes cloud. La sandbox a besoin de git.
Rejouer les réparations, les passes et les agents de secours
Section intitulée « Rejouer les réparations, les passes et les agents de secours »Les réparations de réponses typées et les passes supplémentaires se rejouent comme des tours distincts. replaying.remainingTurns compte les tours restants ; un agent de rejeu ne sert qu’une fois, créez-en un par rejeu.
Le passage de relais d’un agent de secours se rejoue dans le même tour : les événements du candidat arrêté, l’événement fallback, puis le tour du candidat suivant. Le prompt du candidat suivant n’est pas comparé, puisqu’il est reparti du brief d’origine. Le résultat contient le texte du candidat retenu, les commits de tous les candidats et leur usage cumulé, mais pas de result.fallback.
Traiter les divergences
Section intitulée « Traiter les divergences »Quand le rejeu s’écarte de son journal, il lève ReplayDivergence, une OutpostError de code replay.
Référence API : ReplayDivergenceKind.
turn, expected, actual et commit situent l’écart. divergence: "warn" transforme les écarts prompt, baseline, tree et unrecorded en avertissements et poursuit le rejeu. Un patch qui ne s’applique pas et un journal épuisé lèvent toujours l’erreur.
Avec warn, un journal enregistré sans replayable rejoue ses événements sans commits.
Rejouer un brief qui nomme sa branche
Section intitulée « Rejouer un brief qui nomme sa branche »Un brief qui utilise {{WORK_BRANCH}} met le nom de la branche dans le prompt. Une branche integrate reçoit un nouveau nom généré à chaque exécution : son prompt ne correspond donc jamais.
Rejouez sur une branche named portant le nom enregistré, supprimée au préalable pour repartir de la baseline, ou rejouez avec divergence: "warn".
Transformer une exécution en test
Section intitulée « Transformer une exécution en test »Enregistrez une fois le journal dans fixtures/parser-fix.json avec JSON.stringify(journal), et posez le tag parser-fix-base sur le commit de départ de la branche enregistrée. Le test le rejoue sur une nouvelle branche issue de ce tag.
Le test échoue avec une ReplayDivergence quand le brief ou la baseline change. Chaque exécution laisse sa branche replay/… derrière elle.
- Un journal correspond à un dispatch. Un workflow entier ne se rejoue pas.
- Seuls les commits sont rejoués. Les modifications non commitées du worktree ne sont pas enregistrées.
- Un rejeu ne peut être ni repris, ni forké, ni réorienté, et il n’a pas de conversation à capturer.
- Les commits signés sont reconstruits sans leur signature : leurs identifiants diffèrent.
API : createReplayAgent · ReplayAgent · ReplayDivergence · WorkspaceCommitsEvent · Logging · readJournal