Vrais bugs corrigés :
- core/execution/target_resolver.py : suppression de 5 lignes de dead code
après return (vestige de refacto incomplète référençant des params
jamais assignés à self : similarity_threshold, use_spatial_fallback)
- agent_v0/agent_v1/core/executor.py:2180 : variable `prefill` référencée
mais jamais définie. Initialisation explicite ajoutée en amont
(conditionnée sur _is_thinking_popup, cohérent avec l'append du message)
Fichier supprimé :
- core/security/input_validator_new.py : contenu corrompu (texte inversé,
artefact de copier-coller), jamais importé nulle part, 550 erreurs ruff
à lui seul
Workflow CI :
- Exclusions ajoutées pour dossiers legacy connus cassés :
- agent_v0/deploy/windows_client/ (clone obsolète)
- tests/property/ (cf. MEMORY.md — imports cassés)
- tests/integration/test_visual_rpa_checkpoint.py (VisualMetadata
inexistant, déjà documenté)
Résultat : "ruff All checks passed!" sur core/ agent_v0/ tests/
(avec E9,F63,F7,F82 — syntax + undefined critiques).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
22 KiB
Synthèse — 11 avril 2026 (préparée pendant ton absence)
Ce document résume ce qui s'est passé pendant ton absence. Lecture : ~10 minutes.
🎯 À lire en premier (60 secondes)
Score global guardian : 6.8/10 — direction bonne, 5 commits du jour propres sans régression, mais 3 points critiques à adresser.
Les 3 actions à faire en rentrant (ordre de priorité)
- 🔴 P0 — Committer
replay_failure_logger.py(fichier utilisé partout mais pas tracké git, un fresh clone ne démarre plus). 15 minutes. Bloquant absolu. Guardian item C1. - 🔴 P0 — Corriger l'asymétrie
Fenêtre incorrectestrict → pause apprentissage (même pattern queno_screen_change strictdu commit7cc03f6f1, mais sur une autre branche). 1-2h. C'est exactement le bug qui a cassé ton test chirurgical ce matin (tu vas voir la timeline dans Partie 1). Guardian item C2. - 🔴 P1 — Premier replay Notepad E2E réussi pour activer Phase 1 apprentissage. La DB
data/learning/target_memory.dbest vide (0 entrée). La greffe est câblée mais Léa n'a pas encore appris une seule fois en conditions réelles. Tu pourras l'activer dès que #2 est fait. Guardian item E4.
Les 3 choses à savoir absolument
- Test chirurgical : échec propre au premier clic parce que Bloc-notes n'était plus au premier plan sur la VM (focus perdu). La chaîne stricte a fait exactement son job de protection (3 retries puis stop), mais elle est retombée dans la branche retry+stop legacy au lieu de la pause d'apprentissage. C'est la preuve vivante du bug #2 ci-dessus.
- VWB est un piège pour le nettoyage de workflows — bug DB runtime + bridge Léa→VWB qui perd 90% de l'info. Recommandation agent VWB : écrire un petit outil dédié (200 lignes, 1 jour) plutôt que réparer VWB (4-5 jours). Détails en Partie 4.
- Code agent en 3 copies divergentes : source à jour, deploy copy très en retard (sans UIA), worktree migration sans
replay_failure_logger.py. Merger le worktree EN L'ÉTAT casserait le démarrage. C4 du guardian.
Ce qui va vraiment bien 🟢
- Les 5 commits de la journée (
b92cb9db0,f82753deb,9188bd7df,a21f1ea9f,7cc03f6f1) sont tous propres, bien documentés, testés et sans régression - L'instrumentation
[REPLAY]permet un debug multi-étages lisible - La Phase 1 apprentissage est une greffe minimale et non-intrusive (exactement comme prévu dans le plan)
- Le fix de C (
7cc03f6f1) montre la rigueur post-correction : re-lecture des feedbacks mémoire, pas de rustine - Tests E2E + unit (hors VWB) toujours verts : 56/56
Le détail complet ci-dessous, partie par partie.
Partie 1 — Résultat du test chirurgical
Protocole
- Replay
replay_free_3935cd0blancé sur la sessionsess_20260411T084629_2d588e - 3 actions injectées : click
Fichier→ wait 800ms → clickEnregistrer - Chaque click en mode
success_strict=True,expected_before='test.txt – Bloc-notes' - Les gardes B (score + drift) et C (pause apprentissage) sont en place
Timeline
09:31:09 DISPATCH test_chir_1_fichier (click Fichier)
09:31:11 REPORT success=False error="Fenêtre incorrecte: 'Program Manager' (attendu: 'test.txt – Bloc-notes')"
09:31:11 VERIFY final_success=False
09:31:11 DISPATCH retry1
09:31:12 REPORT success=False error="Fenêtre incorrecte: 'Program Manager' ..." (identique)
09:31:13 DISPATCH wait_retry (2s)
09:31:16 DISPATCH retry2
09:31:17 REPORT success=False error="Fenêtre incorrecte: 'Program Manager' ..." (identique)
09:31:18 DISPATCH retry3
09:31:19 REPORT success=False error="Fenêtre incorrecte: 'Program Manager' ..." (identique)
09:31:19 Replay échoué à test_chir_1_fichier_retry3 après 3 retries: status=error
Analyse critique
Ce qui a BIEN fonctionné (à conserver) :
_validate_match_contextcôté agent Windows : a détecté le mismatch de fenêtre active (Program Managervstest.txt – Bloc-notes)- Pas de clic dans le vide : la pré-vérif stricte refuse de cliquer quand la fenêtre active n'est pas celle attendue, exactement comme prévu
- Instrumentation
[REPLAY]parfaitement lisible : chaque étape, chaque erreur, chaque retry - Retry automatique × 3 avec wait interleaved
Ce qui a MAL fonctionné (à corriger) :
-
Bloc-notesn'était plus au premier plan quand le test a démarré. La fenêtre active sur la VM étaitProgram Manager(= le bureau Windows). Hypothèses :- Tu as fermé Bloc-notes avant de partir
- Un événement Windows a volé le focus (notification, chat Léa, etc.)
- Bloc-notes était minimisé
-
L'erreur
Fenêtre incorrecteen mode strict retombe dans la branche retry+stop (réflexe RPA classique), pas dans la pause apprentissage. C'est une incohérence avec le correctif C que j'ai fait pourno_screen_change: les deux devraient avoir le même traitement.
Ce qu'il aurait fallu faire
Dans api_stream.py, la branche qui traite l'erreur Fenêtre incorrecte devrait :
- En mode strict :
status = "paused_need_help"avecpause_message = "Je m'attendais à voir 'test.txt – Bloc-notes' mais je vois 'Program Manager'. Peux-tu me montrer la bonne fenêtre ?"→ queue intacte, attente d'intervention humaine - En mode legacy (non strict) : retry × 3 puis continue (comportement actuel)
C'est symétrique au correctif C (no_screen_change strict → pause apprentissage). À faire dans un prochain commit.
Ce que ça valide quand même
Malgré l'échec sur un problème environnemental (focus perdu), la chaîne stricte complète fonctionne :
- Pré-vérif stricte ✅
- Retry automatique ✅
- Arrêt propre après retries ✅
- Instrumentation lisible ✅
- Pas de clic "aveugle" dans le désordre ✅
On a juste besoin d'aligner le traitement d'erreur sur la philosophie d'apprentissage.
Partie 2 — Dettes techniques connues (pré-audit)
En attendant le rapport du project-quality-guardian, voici ce que je sais déjà :
Dettes hautes (connues et documentées)
agent_v0/deploy/windows_client/agent_v1/core/executor.py: 1302 lignes de divergence non committée avec le dev copy. Risque à chaque nouveau packaging Windows.- Module
replay_failure_logger.py: importé dansapi_stream.pymais PAS tracké dans git. Bug pré-existant signalé par le subagent VWB tout à l'heure. À vérifier : soit le fichier existe sur disque (ignoré par gitignore), soit l'import est cassé silencieusement. - Migration
agent_v0/→ top-level : non mergée, dans un worktree (.claude/worktrees/agent-a0ebc90f/). Trois commits prêts mais en attente de ton review. visual_workflow_builder/backend/instance/workflows.db: modifié non committé depuis le début de la session. Probablement des données de test.live_session_manager.py: modifié non committé. Dans l'état initial de la session, devrait être committé séparément ou ignoré.
Dettes moyennes
_a_trier/: dossier de code/scripts à trier, jamais nettoyé. Grande taille, pollue les grep.archives/: ancien code archivé dans le dépôt. Grossit le repo.- Phase 1 apprentissage activable mais non testée en conditions réelles :
TargetMemoryStoreest branché mais aucune session n'a encore déclenché unmemory_record_successni unmemory_lookup HIT. Attend le premier replay complet qui réussit. - Agent Windows dev vs deploy vs build/Lea/ : trois copies parallèles du code agent, avec divergences possibles à chaque modification.
Dettes basses
- Clics parasites d'arrêt d'enregistrement : systématiquement capturés dans les sessions (clic sur systray, icône Léa, bouton Arrêter). À filtrer côté captor (ex: ignorer les N dernières secondes, ou tout clic sur fenêtre Léa).
- Phrases types non externalisées :
pause_message,error_description, etc. sont hardcodées dans le code. Doivent passer en JSON/YAML i18n-ready. - Service
worker(port 5099) : toujours inactif. Le worker VLM qui compile les sessions en workflows n'est pas lancé. Résultat : les sessions enregistrées ne sont jamais compilées automatiquement en ExecutionPlan.
Partie 3 — Ce que j'ai fait pendant ton absence (commits)
Aucun commit pendant ton absence. Juste :
- Lancement du test chirurgical (échec propre comme analysé)
- Lancement de 2 agents d'audit en background
- Création de ce document de synthèse
Partie 4 — Résultat des agents d'audit
Audit projet global — TERMINÉ ✅
Score global : 6.8/10 — direction technique bonne, 5 commits du jour propres et sans régression, mais incohérence philosophique non corrigée + dette de cohérence multi-copies.
🔴 Les 3 choses à savoir en rentrant (synthèse exécutive du guardian)
-
Phase 1 apprentissage est techniquement branchée MAIS
data/learning/target_memory.dbest VIDE (0 entrée). Aucun replay n'a encore survécu au post-cond strict pour cristalliser. Ça veut dire que tu n'as pas encore vu Léa apprendre, tu as juste câblé l'apprentissage. Le premier replay qui passe en entier déclenchera la boucle. -
Asymétrie strict pré-vérif vs post-vérif (gros point) : le fix
7cc03f6f1corrigeno_screen_change strict → paused_need_help, mais la brancheFenêtre incorrecteen pré-vérif strict retombe toujours en retry+stop legacy. C'est une violation directe defeedback_failure_is_learning.mdsur un chemin différent. Même pattern, même oubli. C'est exactement ce qui a cassé ton test chirurgical ce matin. -
Trois copies divergentes du code agent :
agent_v0/agent_v1/(source à jour avec UIA, grounding, policy, recovery)agent_v0/deploy/windows_client/agent_v1/(1303 lignes non committées, sansuia_helper.py).claude/worktrees/agent-a0ebc90f/(migration top-level, sansreplay_failure_logger.py)
Tout packaging Windows depuis la deploy copy manque UIA + tous les fix du 10-11 avril. Si tu merges le worktree EN L'ÉTAT, ça casse le démarrage serveur.
Cohérence vision / implémentation
5 principes directeurs de la mémoire :
| # | Principe | Statut | Remarque |
|---|---|---|---|
| A1 | 100% visuel (pas de raccourcis inventés) | ✅ Respecté | Grep OK côté replay V4 |
| A2 | LLM 100% local (Ollama) | ⚠️ Violé dans VWB | vlm_provider.py priorise OpenAI/Gemini/Anthropic avant Ollama, 3 clés cloud dans .env.local |
| A3 | Léa n'est pas une boîte à clic | ⚠️ Partiel | Infra en place mais DB vide + asymétrie pré-vérif |
| A4 | Échec = apprentissage, pas arrêt | ⚠️ Partiel | Fix no_screen_change OK, pas Fenêtre incorrecte |
| A5 | Citrix / 100% vision | ✅ Cohérent | UIA est accélérateur local VM, cascade visuelle reste le core |
Violation critique découverte : visual_workflow_builder/backend/vlm_provider.py ligne 53-72 — la classe VisionHub priorise OpenAI (gpt-4o) → Gemini → Anthropic → Ollama en dernier. Importé par app.py:165. Un client déployé avec les mêmes clés d'env enverrait ses écrans médicaux à OpenAI. Grave.
État des fonctionnalités (14 fonctions)
| # | Fonctionnalité | Statut | Preuve |
|---|---|---|---|
| B1 | Agent V1 streaming (capture Windows) | ✅ OK | executor.py 2177L, /replay/next pollé |
| B2 | Streaming server api_stream.py |
✅ OK | 4401L, rpa-streaming active running |
| B3 | SomEngine (YOLO + docTR + VLM) | ✅ OK (dormant dans cascade) | _resolve_by_som défini mais appelé seulement en V4 resolve_order |
| B4 | Resolve cascade (OCR/template/VLM/grounding/SoM) | ✅ OK | _resolve_target_sync:1530 |
| B5 | Contrôle strict étapes (title_match) | ⚠️ OK post, incohérent pré | Cf point #2 ci-dessus |
| B6 | UIA local (lea_uia.exe) | ⚠️ OK source, ABSENT deploy | deploy/windows_client/.../core/ n'a pas uia_helper.py |
| B7 | TargetMemoryStore Phase 1 | ⚠️ Greffe OK, DB vide | SELECT COUNT(*) FROM target_memory → 0 |
| B8 | Instrumentation [REPLAY] |
✅ OK | 13 logs structurés |
| B9 | Garde qualité résolution | ✅ OK | 7 tests unitaires inline |
| B10 | no_screen_change strict → pause |
✅ OK | commit 7cc03f6f1 |
| B11 | VWB | ⚠️ Audit séparé — BROKEN en écriture | Voir section VWB ci-dessous |
| B12 | Fédération (core/federation/) |
✅ Import OK, non testée | |
| B13 | Module auth (core/auth/) |
✅ Partiellement branché | |
| B14 | Workers systemd | ⚠️ Mixte | streaming/agent-chat/api OK, dashboard inactive, worker 5099 NOT LISTENING, healthcheck failed |
Dettes techniques — 20 items priorisés (rapport complet)
🔴 Priorité haute (5 items) :
| # | Lieu | Nature | Effort |
|---|---|---|---|
| C1 | agent_v0/server_v1/replay_failure_logger.py |
Fichier ni tracké ni gitignoré, importé à api_stream.py:29. Un git clone ne peut plus démarrer le serveur. |
< 15 min (git add) |
| C2 | api_stream.py branche Fenêtre incorrecte |
Asymétrie avec fix 7cc03f6f1 — bloquer avec paused_need_help au lieu de retry+stop |
1-2h |
| C3 | deploy/windows_client/agent_v1/core/executor.py |
1303 insertions non committées, manque uia_helper.py + grounding.py + policy.py + recovery.py |
Demi-journée |
| C4 | .claude/worktrees/agent-a0ebc90f/ |
Worktree ne contient pas replay_failure_logger.py → merge cassera l'import |
1-2h |
| C5 | tests/unit/test_som_integration.py::test_resolve_success |
Mock cassé par refactoring, cible api_stream._get_som_engine_api au lieu de resolve_engine.* |
30 min |
🟡 Priorité moyenne (7 items) :
- C6 :
vlm_provider.pycloud-first (violation A2) — 1-2h - C7 :
live_session_manager.py118 lignes non committées (code propre utile) — 30 min - C8 : Worker port 5099 inactif (sessions jamais compilées en ExecutionPlan) — 1-2h
- C9 : Services systemd healthcheck + artifact-retention failed — 30 min
- C10 : Scaffold vide
agent_v1/top-level — < 15 min - C11 : 22 fichiers en
Mnon committés (diffus) — demi-journée triage - C12 :
core/detection/vlm_config.pynon tracké — 10 min
🟢 Priorité basse (8 items) :
- C13 :
_a_trier/561 Mo +visual_workflow_builder/_a_trier/7.6 Go - C14 : 2 venvs VWB → 15.6 Go disque
- C15 :
core/execution/target_resolver.py(3495L V3 dormant) - C16 : README.md obsolète (décembre 2024)
- C17 :
web_dashboard/app.py.bak_20260304_2225 - C18 :
archives/21 Mo committé dans le repo - C19 : 53 TODO/FIXME/HACK dans Python
- C20 :
data/training/live_sessions/5.1 Go sans rotation
Régressions potentielles depuis le matin
Aucune nouvelle régression introduite par les 5 commits du jour. L'incohérence Fenêtre incorrecte est pré-existante (branche legacy qui aurait dû être corrigée en même temps). Guardian a vérifié les 4 branches de /replay/result (lignes 3090-3330) — elles s'enchaînent proprement, pas d'interaction non triviale entre D1-D5.
Recommandations priorisées du guardian
| # | Priorité | Action | Effort | Justification vision |
|---|---|---|---|---|
| E1 | P0 | Committer replay_failure_logger.py |
< 15 min | Empêche tout fresh clone/deploiement |
| E2 | P0 | Corriger asymétrie Fenêtre incorrecte → paused_need_help |
1-2h | Respect feedback_failure_is_learning.md + débloque test chirurgical |
| E3 | P1 | Sync deploy copy avec source + ajouter uia_helper/grounding/policy/recovery | Demi-journée | Sans ça Léa n'a pas accès à ses propres progrès sur VM |
| E4 | P1 | Premier replay E2E réussi pour activer Phase 1 (Notepad propre, 2 fois, vérifier target_memory.db) | 1-2h | Seule façon de prouver que Léa apprend vraiment |
| E5 | P1 | Décider du sort du worktree (compléter ou refaire) | 1-2h | Éviter dette multi-copies |
| E6 | P2 | Gater vlm_provider.py derrière env var (violation 100% local) |
1-2h | Respect feedback_local_only.md |
| E7 | P2 | Relancer worker 5099 + vérifier compilation sessions | 1-2h | Pipeline apprentissage cassé en bout |
| E8 | P2 | Committer live_session_manager.py |
30 min | Dette git |
| E9 | P3 | Réparer test_som_integration | 30 min | Suite unit verte |
| E10 | P3 | Nettoyer 2 venvs VWB | 30 min | 15.6 Go disque |
Audit VWB — TERMINÉ ✅
TL;DR : VWB est un piège pour notre besoin. Recommandation = Option A (petit outil dédié 1 jour).
État global
Partiellement fonctionnel en lecture, CASSÉ en écriture (bug runtime trivial), et gravement amputé en contenu (bridge Léa→VWB perd 90% de l'information). Le scaffolding est là, la chaîne end-to-end ne fonctionne pas.
Bug bloquant immédiat
Le processus 1800738 (vwb-backend:5002) tient un handle sur une version supprimée de workflows.db (6 file descriptors sur (deleted)). Toute écriture → sqlite3.OperationalError: attempt to write a readonly database. Un systemctl --user restart rpa-vwb-backend règle ce point — mais les vrais problèmes restent.
Ambiguïtés structurelles (dette)
| Problème | Impact |
|---|---|
frontend/ (vieux, inactif) vs frontend_v4/ (actif) |
Confusion à chaque lecture code |
app.py (5002, avec api_v3) vs app_lightweight.py (5003, SANS api_v3) |
Deux backends parallèles |
db/models.py (legacy) vs instance/workflows.db SQLAlchemy (api_v3) |
Deux DB parallèles — workflows visibles ici ≠ workflows visibles là |
Ce qui marche côté code (vérifié)
GET /api/v3/learned-workflows: liste 126 workflows Léa sur disque- Routes CRUD Step : add/update/delete/reorder (existent backend + client TS)
- PropertiesPanel 1415 lignes — édite délais, texte, direction, hover_duration
- UI drag-and-drop ajout step via tool palette → React Flow
POST /api/v3/execute-windows: proxy vers streaming server, fonctionnel
Ce qui manque (critique pour le nettoyage)
- Import compound = coquille vide : 95% des edges Léa sont des actions
type: compoundavec 10-40 sous-étapes (clic + waits + text_input lettre par lettre). Le bridge crée UN seul step VWB pour toute la compound → "Impossible de nettoyer ce qu'on ne voit pas" - Pas d'auth VWB → streaming server :
requests.get(...)sans header Authorization, doncstreaming_server_available: false. VWB ne voit que les workflows déjà compilés (max 4 avril), pas les sessions récentes - Pas de screenshots attachés : les
shots/*.pngde session ne sont jamais liés aux steps importés - Pas de réordonnancement UI :
reorderStepsexiste backend + client, mais aucun composant React ne l'appelle - Édition target_spec absente : PropertiesPanel n'a aucun champ
x_pct,y_pct,target_role,target_text,vlm_description. Impossible de corriger un faux positif - Pas d'ingestion raw events :
live_events.jsonl,build_replay_from_raw_events,execution_plan_to_actionsne sont pas importés dans VWB - Pas de liste "sessions récentes" : aucun endpoint VWB qui liste les
sess_*sur disque - Zéro test sur le pont Léa ↔ VWB
Effort de réparation estimé
| Item | Effort |
|---|---|
| Restart service (fix DB readonly) | 5 min |
| Ajouter auth Bearer VWB → :5005 | 30 min |
| Décomposer actions compound en N steps VWB | 1 jour |
| Attacher screenshots aux steps | 1 jour |
| Édition target_spec dans PropertiesPanel | 0.5 jour |
| Drag-to-reorder UI | 0.5 jour |
Endpoint /live-sessions + importer raw |
1-2 jours |
| Tests minimal | 0.5 jour |
| Total | 4-5 jours |
Et encore, on hériterait de la dette (deux DB, deux backends, zéro test, frontend abandonné).
Recommandation — 3 options
Option A (recommandée) — Outil dédié léger, 1 jour ⭐ Écrire un petit Flask (200 lignes) qui :
- Liste les sessions
live_sessions/*/sess_*sur disque - Charge
live_events.jsonlviabuild_replay_from_raw_events(existe déjà dansstream_processor.py:1279) - Affiche la liste linéaire des actions + screenshots
shots/correspondants - Checkbox "supprimer cette étape" + édition texte simple
- Re-sérialise et POST vers
/api/v1/traces/stream/replay/raw
Évite toute la complexité VWB et cible exactement le besoin : "supprimer 3 clics parasites et relancer".
Option B — Réparer VWB minimalement (2 jours) — restart + auth + décomposer compound. Hérite de toute la dette UX.
Option C — Abandonner VWB — suggéré par l'accumulation de dette (126 workflows "pending_review", zéro test sur le pont, deux backends, frontend abandonné)
Vote de l'agent VWB : "Option A. Le besoin réel est 'supprimer 3 clics parasites et relancer' — c'est 30 secondes d'UX, pas un Visual Workflow Builder."
Mon vote aussi : A. Parce que ça sert directement notre prochain test replay. B prend plus de temps qu'il ne nous fait gagner. C laisse la dette pourrir.
Partie 5 — Actions recommandées quand tu rentres
Par ordre de priorité :
P0 — À faire dans les 10 premières minutes de ton retour
- Vérifier sur la VM que Bloc-notes est bien fermé (ou pas), et si possible ce qui a volé le focus
- Lire la partie 1 de cette synthèse (résultat test chirurgical)
- Lire les rapports des 2 agents (sections 4)
P1 — À discuter avec moi
- Corriger l'incohérence
Fenêtre incorrecte strict → pause apprentissage(même pattern que C) - Décider : on continue à stabiliser le replay avec des tests manuels, OU on passe à l'intégration d'OS-Atlas-Base-7B comme grounder, OU on attaque VWB comme outil de correction ?
- Externaliser les phrases types en JSON i18n (petit commit)
P2 — Plus tard dans la journée
- Merger la migration
agent_v0/→ top-level (worktree déjà prêt) - Investiguer le fichier
replay_failure_logger.py(importé, pas tracké) - Démarrer le worker VLM pour que les sessions soient compilées en workflows
P3 — Semaine prochaine
- Nettoyer
_a_trier/etarchives/ - Sync de l'agent deploy copy avec le dev
- Implémenter le filtre "ignore clics de fin d'enregistrement" côté captor
Document généré automatiquement pendant l'absence de Dom. Sera mis à jour avec les rapports des agents d'audit.