docs: add POC specs, handoffs, and research notes
This commit is contained in:
257
docs/plans/BACKLOG_HORIZON1_LEA_FIRST_2026-05-19.md
Normal file
257
docs/plans/BACKLOG_HORIZON1_LEA_FIRST_2026-05-19.md
Normal file
@@ -0,0 +1,257 @@
|
||||
# Backlog Horizon 1 Lea-first -- 2026-05-19
|
||||
|
||||
**Objet**
|
||||
- Transformer `Horizon 1` en backlog d'execution concret.
|
||||
- Se limiter au coeur produit `Lea-first`.
|
||||
- Ne pas reintroduire `VWB` ou 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 -> resume` est 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.py`
|
||||
- `agent_v0/agent_v1/core/executor.py`
|
||||
- `agent_v0/server_v1/api_stream.py`
|
||||
- `agent_v0/server_v1/stream_processor.py`
|
||||
- `agent_v0/server_v1/resolve_engine.py`
|
||||
- `agent_v0/server_v1/replay_learner.py`
|
||||
- `agent_v0/server_v1/replay_memory.py`
|
||||
- `core/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.py`
|
||||
- `pytest -q tests/integration/test_stream_processor.py tests/smoke/test_smoke_e2e_minimal.py`
|
||||
- `pytest -q tests/integration/test_pause_for_human.py tests/unit/test_replay_critic.py`
|
||||
|
||||
Conclusion :
|
||||
|
||||
- les briques `resume`, `loop detector`, `target memory`, `stream processor` et le smoke critique offline sont deja exploitables comme premier garde-fou
|
||||
- `pause_for_human` et `replay_critic` peuvent rejoindre ce garde-fou immediatement
|
||||
- il reste un warning `pytest-asyncio` de configuration de boucle, non bloquant pour Horizon 1
|
||||
- `tests/unit/test_policy_grounding_recovery_learning.py` n'est pas encore un gate portable : 4 tests `RecoveryEngine` tombent localement sur `ModuleNotFoundError: 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.py`
|
||||
- `agent_v0/server_v1/api_stream.py`
|
||||
- `agent_v0/agent_v1/main.py`
|
||||
- `agent_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 queue` pour 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.py`
|
||||
- `tests/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.py`
|
||||
- `agent_v0/server_v1/loop_detector.py`
|
||||
- `agent_v0/agent_v1/network/feedback_bus.py`
|
||||
- `agent_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_checks` restent obligatoires quand requis
|
||||
|
||||
**Causes a couvrir explicitement**
|
||||
- `pause_for_human`
|
||||
- `target_not_found`
|
||||
- `wrong_window`
|
||||
- `no_screen_change_strict`
|
||||
- `system_dialog`
|
||||
- `loop_detected`
|
||||
|
||||
**Acceptation**
|
||||
- chaque pause expose une raison, un message et un comportement de reprise clairs
|
||||
- `resume` ne relance pas une action qui etait une pause intentionnelle
|
||||
- `cancel` vide proprement la queue
|
||||
- aucun cas de pause ne laisse le replay dans un etat ambigu
|
||||
|
||||
**Gate associe**
|
||||
- `tests/integration/test_replay_resume_acknowledgments.py`
|
||||
- `tests/integration/test_loop_detector_replay.py`
|
||||
- `tests/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.py`
|
||||
- `agent_v0/server_v1/replay_learner.py`
|
||||
- `agent_v0/server_v1/replay_memory.py`
|
||||
- `agent_v0/server_v1/resolve_engine.py`
|
||||
- `core/learning/target_memory_store.py`
|
||||
|
||||
**Taches**
|
||||
- verifier le contrat `actual_position` entre 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 bien `target_memory.db`
|
||||
- tracer un cas de `memory_lookup HIT` jusqu'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/*.jsonl` et `data/learning/events/*/resolution_events.jsonl` sont utiles et lisibles
|
||||
- `target_memory.db` contient des entrees correspondant a des cibles reelles du workflow canonique
|
||||
|
||||
**Gate associe**
|
||||
- `tests/unit/test_target_memory_store.py`
|
||||
- `tests/unit/test_policy_grounding_recovery_learning.py`
|
||||
- `tests/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.py`
|
||||
- `tests/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.py`
|
||||
- `pytest -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.py` en seconde couronne tant que la dependance `pynput` n'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 :
|
||||
|
||||
1. ambiguite de replay `session_id / machine_id / queue`
|
||||
2. cas de pause/reprise incoherents
|
||||
3. apprentissage non persiste ou non reutilise
|
||||
4. runbook et collecte d'artefacts
|
||||
|
||||
## 5. Integration de l'audit Claude
|
||||
|
||||
Reference :
|
||||
|
||||
- [AUDIT_LEA_FIRST_RUNTIME_2026-05-19.md](/home/dom/ai/rpa_vision_v3/docs/AUDIT_LEA_FIRST_RUNTIME_2026-05-19.md)
|
||||
|
||||
Important :
|
||||
|
||||
- dans ce repo, `agent_v0/` reste le **conteneur de chemin** du code courant
|
||||
- l'audit qui parle de `agent_v0/agent_v1` et `agent_v0/server_v1` parle 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_active` est mal gere cote client pendant `replay_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`, appelle `build_replay_from_raw_events(...)`, puis injecte la queue de replay
|
||||
- en revanche, `finalize` n'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_title` est reel
|
||||
- mais sur le flux Lea-first natif, `build_replay_from_raw_events(...)` propage deja `window_title` dans 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 `TargetMemoryStore` est la seule boucle d'apprentissage necessaire court terme
|
||||
|
||||
### Reclassement pratique pour Horizon 1
|
||||
|
||||
- `P0 reel` : correction humaine cassee
|
||||
- `P0 reel` : corruption possible des captures moniteur
|
||||
- `P1 reel` : pause/reprise desynchronisee cote client
|
||||
- `P1 structurant` : absence de chainage produit propre `finalize -> replay-session`
|
||||
- `P1 risque` : memoire trop dependante de `window_title`
|
||||
- `P2 assume` : branches `core/learning/*` hors chemin nominal court terme
|
||||
|
||||
## 6. Ce que je retiens pour la suite immediate
|
||||
|
||||
Ordre de traitement mis a jour :
|
||||
|
||||
1. corriger `record_human_correction()` pour rouvrir l'apprentissage supervise
|
||||
2. blinder la capture moniteur contre les dimensions aberrantes
|
||||
3. corriger `_replay_active` sur `action=null + replay_paused=true`
|
||||
4. definir si `finalize` doit proposer ou lancer explicitement `replay-session`
|
||||
5. renforcer le fallback `window_title` pour 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
|
||||
Reference in New Issue
Block a user