10 KiB
Backlog Horizon 1 Lea-first -- 2026-05-19
Objet
- Transformer
Horizon 1en backlog d'execution concret. - Se limiter au coeur produit
Lea-first. - Ne pas reintroduire
VWBou la demo comme reference produit.
1. Definition de done
Horizon 1 est termine quand les conditions suivantes sont vraies :
- un workflow Lea-first canonique peut etre capture puis rejoue sans passer par
VWB pause -> intervention humaine -> resumeest fiable et comprehensible- les succes, echecs et corrections humaines alimentent vraiment la memoire persistante
- on dispose d'un gate minimal reproductible avant toute session terrain
- on dispose d'un runbook operatoire court pour lancer, observer et reprendre un replay
2. Baseline technique au 2026-05-19
Pipeline reel retenu
Le chemin nominal reste :
capture Lea -> stream serveur -> replay direct -> verification -> memory
Fichiers pivots :
agent_v0/agent_v1/main.pyagent_v0/agent_v1/core/executor.pyagent_v0/server_v1/api_stream.pyagent_v0/server_v1/stream_processor.pyagent_v0/server_v1/resolve_engine.pyagent_v0/server_v1/replay_learner.pyagent_v0/server_v1/replay_memory.pycore/learning/target_memory_store.py
Gate minimal deja vert
Tests executes localement le 2026-05-19 :
pytest -q tests/integration/test_replay_resume_acknowledgments.py tests/integration/test_loop_detector_replay.py tests/unit/test_target_memory_store.pypytest -q tests/integration/test_stream_processor.py tests/smoke/test_smoke_e2e_minimal.pypytest -q tests/integration/test_pause_for_human.py tests/unit/test_replay_critic.py
Conclusion :
- les briques
resume,loop detector,target memory,stream processoret le smoke critique offline sont deja exploitables comme premier garde-fou pause_for_humanetreplay_criticpeuvent rejoindre ce garde-fou immediatement- il reste un warning
pytest-asynciode configuration de boucle, non bloquant pour Horizon 1 tests/unit/test_policy_grounding_recovery_learning.pyn'est pas encore un gate portable : 4 testsRecoveryEnginetombent localement surModuleNotFoundError: pynput- ce gate ne prouve pas encore le replay Windows reel de bout en bout
3. Ordre d'attaque
Chantier H1-A -- Stabiliser le replay nominal
But
- faire du replay direct le chemin assume et observable
Fichiers cibles
agent_v0/server_v1/stream_processor.pyagent_v0/server_v1/api_stream.pyagent_v0/agent_v1/main.pyagent_v0/agent_v1/core/executor.py
Taches
- figer un workflow Lea-first canonique de reference
- verifier que
build_replay_from_raw_events(...)produit des actions propres sur ce workflow - verifier le couplage
session_id / machine_id / replay queuepour eviter les confusions inter-machines - tracer explicitement le passage
capture finalisee -> replay injecte -> action poll -> resultat recu
Acceptation
- a partir d'une capture Lea, le serveur injecte une queue de replay exploitable sans bridge VWB
- l'agent recupere les actions avec le bon
machine_id - l'index courant du replay et le nombre d'actions restantes restent coherents jusqu'a completion ou pause
Gate associe
tests/integration/test_stream_processor.pytests/smoke/test_smoke_e2e_minimal.py
Chantier H1-B -- Fiabiliser la pause supervisee
But
- rendre deterministe et lisible la boucle
pause / aide humaine / reprise
Fichiers cibles
agent_v0/server_v1/api_stream.pyagent_v0/server_v1/loop_detector.pyagent_v0/agent_v1/network/feedback_bus.pyagent_v0/agent_v1/ui/chat_window.py
Taches
- formaliser la matrice des causes de
paused_need_help - distinguer les pauses qui doivent reinjecter l'action de celles qui ne doivent pas la reinjecter
- verifier l'alignement entre payload serveur, bulle Lea et endpoint
/replay/{id}/resume - verifier que les acquittements de
safety_checksrestent obligatoires quand requis
Causes a couvrir explicitement
pause_for_humantarget_not_foundwrong_windowno_screen_change_strictsystem_dialogloop_detected
Acceptation
- chaque pause expose une raison, un message et un comportement de reprise clairs
resumene relance pas une action qui etait une pause intentionnellecancelvide proprement la queue- aucun cas de pause ne laisse le replay dans un etat ambigu
Gate associe
tests/integration/test_replay_resume_acknowledgments.pytests/integration/test_loop_detector_replay.pytests/integration/test_pause_for_human.py
Chantier H1-C -- Faire apprendre la memoire de replay
But
- s'assurer que la boucle d'apprentissage est branchee sur le runtime reel, pas seulement documentee
Fichiers cibles
agent_v0/server_v1/api_stream.pyagent_v0/server_v1/replay_learner.pyagent_v0/server_v1/replay_memory.pyagent_v0/server_v1/resolve_engine.pycore/learning/target_memory_store.py
Taches
- verifier le contrat
actual_positionentre agent et serveur - verifier que
memory_record_success()ne se declenche qu'apres succes verifie - verifier que
memory_record_failure()decremente bien la fiabilite utile - verifier que
record_human_correction()nourrit bientarget_memory.db - tracer un cas de
memory_lookup HITjusqu'a la resolution suivante
Acceptation
- au moins un cas reel montre la sequence :
target_not_found ou no_screen_change_strict -> correction humaine -> stockage -> hit memoire sur replay suivant - les fichiers
data/learning/replay_results/*.jsonletdata/learning/events/*/resolution_events.jsonlsont utiles et lisibles target_memory.dbcontient des entrees correspondant a des cibles reelles du workflow canonique
Gate associe
tests/unit/test_target_memory_store.pytests/unit/test_policy_grounding_recovery_learning.pytests/unit/test_replay_critic.py
Chantier H1-D -- Runbook et gate terrain
But
- disposer d'un protocole d'execution simple avant toute session reelle
Fichiers cibles
agent_v0/deploy/test_replay_diag.pytests/smoke/test_smoke_e2e_minimal.py- nouvelle doc de runbook Lea-first
Taches
- definir un gate local minimum avant session terrain
- definir un workflow canonique a jouer a blanc avant toute session utilisateur
- ecrire une checklist courte
avant capture / avant replay / pendant pause / apres correction - rendre explicites les artefacts a conserver apres un incident
Acceptation
- on sait dire en moins de 5 minutes si la machine est "prete a rejouer"
- on sait quoi collecter en cas d'echec sans improviser
- on sait faire une reprise propre apres une pause supervisee
Gate associe
python agent_v0/deploy/test_replay_diag.pypytest -q tests/smoke/test_smoke_e2e_minimal.py
4. Sequence immediate
Etape 1 -- Geler le gate Horizon 1
- conserver les 5 fichiers de test deja verts comme premier noyau
- ajouter maintenant
tests/integration/test_pause_for_human.py - ajouter maintenant
tests/unit/test_replay_critic.py - garder
tests/unit/test_policy_grounding_recovery_learning.pyen seconde couronne tant que la dependancepynputn'est pas geree proprement pour le contexte de test
Etape 2 -- Choisir le workflow canonique
- un seul workflow Lea-first
- court
- peu de fenetres
- au moins un clic, une saisie, une verification, une pause possible
Etape 3 -- Prioriser les corrections
Ordre de traitement :
- ambiguite de replay
session_id / machine_id / queue - cas de pause/reprise incoherents
- apprentissage non persiste ou non reutilise
- runbook et collecte d'artefacts
5. Integration de l'audit Claude
Reference :
Important :
- dans ce repo,
agent_v0/reste le conteneur de chemin du code courant - l'audit qui parle de
agent_v0/agent_v1etagent_v0/server_v1parle donc bien du runtime actuel
Points valides
record_human_correction()est reellement casse- la capture via
mss.monitors[1]n'a pas de garde contre des dimensions aberrantes _replay_activeest mal gere cote client pendantreplay_paused=true
Points a corriger dans la formulation
-
le replay direct existe bien via
POST /api/v1/traces/stream/replay-session -
ce endpoint charge
live_events.jsonl, appellebuild_replay_from_raw_events(...), puis injecte la queue de replay -
en revanche,
finalizen'enchaine pas ce chemin automatiquement et la surface produit reste morcelee -
build_workflow_replay()est bien orphelin, mais cela ne prouve pas que le replay direct n'existe pas -
le gating memoire sur
window_titleest reel -
mais sur le flux Lea-first natif,
build_replay_from_raw_events(...)propage dejawindow_titledans les clics enrichis -
le risque est donc surtout : actions non enrichies, cas degradés, et workflows non Lea-first ou incompletés
-
core/learning/*non branche au runtime serveur est un constat juste -
mais pour Horizon 1, ce n'est pas un blocage du coeur produit si on assume que
TargetMemoryStoreest la seule boucle d'apprentissage necessaire court terme
Reclassement pratique pour Horizon 1
P0 reel: correction humaine casseeP0 reel: corruption possible des captures moniteurP1 reel: pause/reprise desynchronisee cote clientP1 structurant: absence de chainage produit proprefinalize -> replay-sessionP1 risque: memoire trop dependante dewindow_titleP2 assume: branchescore/learning/*hors chemin nominal court terme
6. Ce que je retiens pour la suite immediate
Ordre de traitement mis a jour :
- corriger
record_human_correction()pour rouvrir l'apprentissage supervise - blinder la capture moniteur contre les dimensions aberrantes
- corriger
_replay_activesuraction=null + replay_paused=true - definir si
finalizedoit proposer ou lancer explicitementreplay-session - renforcer le fallback
window_titlepour le record / lookup memoire
7. Premier ticket d'execution
Le premier ticket que je lancerais sans attendre est :
"Corriger record_human_correction() et valider un vrai cycle correction -> target_memory.db -> hit memoire."
Pourquoi :
- c'est le bug le plus net et le plus rentable de l'audit
- il touche directement la promesse produit Lea-first
- il fournit ensuite un cas de validation concret pour Horizon 1