GEODE
Autonomous Agent Harness
De l’observation à l’action suivante.
Un harnais local d’agent autonome auquel confier recherche, travail sur fichiers et tâches planifiées.
La proposition d’arrêt du modèle ne devient un achèvement que par la vérification.
Pour un arrêt livrable, un modèle qui demande à s’arrêter passe tout de même par la vérification d’achèvement. L’issue est : terminé, poursuite dans le budget ou attente de revue ; limites d’exécution, annulation et erreurs aboutissent à un état d’arrêt distinct.
Vérifier → terminer
Seul un arrêt livrable passe par PreVerify → jugement → PostVerify → Stop. Ni la proposition d’arrêt du modèle ni une instruction de hook ne constitue à elle seule un achèvement.
arun · tour du modèle
loop/agent_loop.pydonnées: proposition d’arrêtarrêt livrable · natural, etc.loop/_guards.py · models.pyQuand le modèle répond en texte sans appel d’outil, le tour devient un candidat d’arrêt natural (forced_text au dernier round autorisé). La proposition d’arrêt d’un modèle n’est pas encore un achèvement.
arrêt livrable · natural, etc.
loop/_guards.py · models.pydonnées: candidat à l’achèvementfinalize_and_return_asyncloop/_lifecycle.pySeuls natural, forced_text et actionable_partial sont des arrêts livrables, et seuls ceux-ci passent à la vérification publique.
finalize_and_return_async
loop/_lifecycle.pyexécuter · décider: PreVerifyPreVerify · STRENGTHENcore/hooks/public.pyAvec STRENGTHEN, le hook PreVerify peut seulement ajouter des exigences et des codes de manque. Il peut rendre le verdict plus strict, jamais le faire passer.
finalize_and_return_async
loop/_lifecycle.pyexécuter · décider: verify_turn_asynccontrôle structurel · empty_turncore/agent/verify.pyUn contrôle structurel vient d’abord (tour vide, model_action_required) ; un échec structurel irréparable saute le jugement sémantique. D’anciens réglages comme off ou rule_based se résolvent en llm_judge et ne peuvent pas désactiver le verdict.
jugement sémantique · LLM ou Jev
core/agent/verify.pydonnées: demande de jugementModèle jugeLe juge sélectionné (juge LLM par défaut, Jev Choice s’il est choisi) est appelé une fois, sans outils, pendant 120 secondes au plus et jamais au-delà du budget de temps restant. Un candidat susceptible de contenir des observations personnelles n’est pas envoyé à un juge auxiliaire.
jugement sémantique · LLM ou Jev
core/agent/verify.pydonnées: passed · rubric_missespolicy_action · lecture du verdictloop/_lifecycle.pyLe verdict porte réussite ou échec, codes de manque, une réflexion pour la tentative suivante et l’utilité d’une nouvelle tentative. Une réussite sémantique ne couvre jamais un contrôle structurel échoué.
policy_action · lecture du verdict
loop/_lifecycle.pyexécuter · décider: décision PostVerifyPostVerify · ACCEPT · REVISE · ESCALATEcore/hooks/public.pyLe hook PostVerify décide ACCEPT, REVISE ou ESCALATE. Un ACCEPT sur un candidat qui a échoué à la vérification devient escalate. Sans décision, la valeur par défaut du runtime s’applique (réussite → accept, réessayable → revise, sinon escalate).
policy_action · lecture du verdict
loop/_lifecycle.pyexécuter · décider: Stop · CONTINUEStop · CONTINUEcore/hooks/public.pyCe n’est qu’en l’absence d’escalade que l’instruction CONTINUE du hook Stop peut demander une poursuite de réparation. Une instruction de hook est une entrée pour la tentative suivante, pas une autorité.
policy_action · lecture du verdict
loop/_lifecycle.pydonnées: completed · enregistrécheckpoint · état de sessionmemory · observabilitySur une réussite suivie d’un accept, les tentatives poursuivies sont fusionnées, le résultat est enregistré et la session est consignée comme completed.
finalize_and_return_async
loop/_lifecycle.pydonnées: réponseIPC · appelant CLIRenvoie la réponse finale si terminé ; une réponse vide avec EXTERNAL_VERIFICATION_REQUIRED en attente de revue ; le motif d’arrêt pour un arrêt sans vérification.
Réparation dans le budget
Un échec réparable poursuit la même requête. Le budget par défaut est de deux tentatives ; une fois épuisé, le candidat attend une revue.
jugement sémantique · LLM ou Jev
core/agent/verify.pydonnées: passed · rubric_missespolicy_action · lecture du verdictloop/_lifecycle.pyLe verdict porte réussite ou échec, codes de manque, une réflexion pour la tentative suivante et l’utilité d’une nouvelle tentative. Une réussite sémantique ne couvre jamais un contrôle structurel échoué.
policy_action · lecture du verdict
loop/_lifecycle.pyexécuter · décider: décision PostVerifyPostVerify · ACCEPT · REVISE · ESCALATEcore/hooks/public.pyLe hook PostVerify décide ACCEPT, REVISE ou ESCALATE. Un ACCEPT sur un candidat qui a échoué à la vérification devient escalate. Sans décision, la valeur par défaut du runtime s’applique (réussite → accept, réessayable → revise, sinon escalate).
policy_action · lecture du verdict
loop/_lifecycle.pyexécuter · décider: Stop · CONTINUEStop · CONTINUEcore/hooks/public.pyCe n’est qu’en l’absence d’escalade que l’instruction CONTINUE du hook Stop peut demander une poursuite de réparation. Une instruction de hook est une entrée pour la tentative suivante, pas une autorité.
budget de poursuite · 2 par défaut
loop/_lifecycle.pyexécuter · décider: réparation · tentative +1_arun_once · poursuite de réparationloop/agent_loop.pyAvec une instruction de réparation, et seulement tant que le numéro de tentative reste sous le budget (deux par défaut), la même requête se poursuit. Une fois le budget atteint, elle devient escalate_budget_exhausted et attend une revue.
En attente de revue
Un verdict inutilisable, une tentative de transformer un échec en réussite ou un budget épuisé retient le candidat et met la session en pause.
verification_error · fermé en cas d’échec
core/agent/verify.pyéchec · sans verdict: verification_errorpolicy_action · lecture du verdictloop/_lifecycle.pyUn juge absent, un délai dépassé ou une réponse invalide devient verification_error : ni réussite ni signal de réparation. Un verdict inutilisable ne tient jamais lieu de succès.
policy_action · lecture du verdict
loop/_lifecycle.pyexécuter · décider: décision PostVerifyPostVerify · ACCEPT · REVISE · ESCALATEcore/hooks/public.pyLe hook PostVerify décide ACCEPT, REVISE ou ESCALATE. Un ACCEPT sur un candidat qui a échoué à la vérification devient escalate. Sans décision, la valeur par défaut du runtime s’applique (réussite → accept, réessayable → revise, sinon escalate).
policy_action · lecture du verdict
loop/_lifecycle.pyexécuter · décider: ESCALATE · pendingRelecteur externeLe candidat est conservé comme pending_text et retenu des réponses ordinaires, le checkpoint est enregistré et la session mise en pause. Aucun relecteur externe n’est contacté automatiquement.
policy_action · lecture du verdict
loop/_lifecycle.pyenregistrer · observer: verdict · lignes de preuvetimeline · lignes de décision du ledgermemory · observabilityLa timeline reçoit des lignes de décision, de preuve et pending, et l’evidence ledger une ligne verification_policy. Ce sont des enregistrements best-effort, pas la preuve d’un effet extérieur.
Arrêts sans vérification
Les arrêts par annulation, limite et infrastructure et les exécutions de control workflow sont enregistrés sans vérification publique.
arun · tour du modèle
loop/agent_loop.pyexécuter · décider: gardes · limitesarrêt par échec · limite · annulationloop/_guards.py · models.pyDes gardes comme les limites de rounds, de temps, de coût et de contexte, l’annulation et la détection d’échecs répétés terminent le tour avec un membre de l’ensemble fermé TerminationReason. Une limite désactivée dans la configuration n’est pas toujours appliquée.
arrêt par échec · limite · annulation
loop/_guards.py · models.pyéchec · sans verdict: arrêt par échec · annulationfinalize_and_return_asyncloop/_lifecycle.pyLes arrêts par annulation, infrastructure et limite n’ont pas de candidat à vérifier ; ils sont donc enregistrés sans vérification publique.
control workflow · vérification publique sautée
ipc_server/poller.pyexécuter · décider: vérification publique sautéefinalize_and_return_asyncloop/_lifecycle.pyQuand un appel IPC demande de sauter la vérification publique ou qu’un control workflow est actif, la vérification publique est désactivée pour cette seule exécution, puis la valeur précédente est rétablie.
finalize_and_return_async
loop/_lifecycle.pydonnées: enregistrement seul · sans vérificationcheckpoint · état de sessionmemory · observabilityUn arrêt sans vérification enregistre tout de même son résultat et son checkpoint, et émet les événements de fin de session.
finalize_and_return_async
loop/_lifecycle.pydonnées: réponseIPC · appelant CLIRenvoie la réponse finale si terminé ; une réponse vide avec EXTERNAL_VERIFICATION_REQUIRED en attente de revue ; le motif d’arrêt pour un arrêt sans vérification.
Toutes les connexions avec la même épaisseur. Choisissez un flux pour ne mettre en évidence que son chemin, avec des étapes numérotées.
- Trait plein · sens de circulation des requêtes, candidats et résultats
- Tirets · exécuter, décider, autoriser, configurer
- Trait mixte long · enregistrements et observation, distincts du verdict
- Tiret court · échec ou verdict inutilisable
- Trait noir épais · le flux sélectionné ; les numéros donnent l’ordre
- Cadre · frontière de code ou d’enregistrement, chemin dans l’en-tête
- Pastille intérieure · composant de cette frontière
- Cadre en tirets · hors de cette frontière
- boucle · finalisation
- arrêts · hooks · verdict
- sauvegarde · enregistrements
- entrée IPC
Seuls les chemins d’appel du commit fixé 9e2c041 sont tracés. La réussite d’un juge est distincte du succès d’un vérificateur de benchmark externe ; l’achèvement est ici une décision interne au runtime.
- Moteur de jugement
- Par défaut, c’est le juge LLM ; Jev Choice ne juge que si judgment_engine vaut jev. Dans les deux cas, un juge inutilisable donne verification_error, jamais un succès.
- Ce que peuvent les hooks
- PreVerify ne peut que durcir le verdict, PostVerify ne peut pas faire passer un candidat en échec, et Stop ne peut demander une poursuite qu’en l’absence d’escalade.
- En attente de revue
- L’attente de revue consigne qu’une décision extérieure est nécessaire. Elle ne notifie personne et ne signifie pas que le résultat a été approuvé.