Files
rpa_vision_v3/docs/SYNTHESE_11AVRIL_MATIN.md
Dom a2b82d3e76
Some checks failed
security-audit / Bandit (scan statique) (push) Successful in 14s
security-audit / pip-audit (CVE dépendances) (push) Successful in 12s
security-audit / Scan secrets (grep) (push) Successful in 9s
tests / Lint (ruff + black) (push) Successful in 15s
tests / Tests sécurité (critique) (push) Has been cancelled
tests / Tests unitaires (sans GPU) (push) Has been cancelled
fix(lint): ruff passe propre — 2 vrais bugs + suppression fichier corrompu
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>
2026-04-15 19:00:16 +02:00

22 KiB
Raw Blame History

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é)

  1. 🔴 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.
  2. 🔴 P0 — Corriger l'asymétrie Fenêtre incorrecte strict → pause apprentissage (même pattern que no_screen_change strict du commit 7cc03f6f1, 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.
  3. 🔴 P1 — Premier replay Notepad E2E réussi pour activer Phase 1 apprentissage. La DB data/learning/target_memory.db est 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_3935cd0b lancé sur la session sess_20260411T084629_2d588e
  • 3 actions injectées : click Fichier → wait 800ms → click Enregistrer
  • 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_context côté agent Windows : a détecté le mismatch de fenêtre active (Program Manager vs test.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) :

  1. Bloc-notes n'était plus au premier plan quand le test a démarré. La fenêtre active sur la VM était Program 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é
  2. L'erreur Fenêtre incorrecte en 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 pour no_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" avec pause_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)

  1. 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.
  2. Module replay_failure_logger.py : importé dans api_stream.py mais 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.
  3. 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.
  4. visual_workflow_builder/backend/instance/workflows.db : modifié non committé depuis le début de la session. Probablement des données de test.
  5. live_session_manager.py : modifié non committé. Dans l'état initial de la session, devrait être committé séparément ou ignoré.

Dettes moyennes

  1. _a_trier/ : dossier de code/scripts à trier, jamais nettoyé. Grande taille, pollue les grep.
  2. archives/ : ancien code archivé dans le dépôt. Grossit le repo.
  3. Phase 1 apprentissage activable mais non testée en conditions réelles : TargetMemoryStore est branché mais aucune session n'a encore déclenché un memory_record_success ni un memory_lookup HIT. Attend le premier replay complet qui réussit.
  4. Agent Windows dev vs deploy vs build/Lea/ : trois copies parallèles du code agent, avec divergences possibles à chaque modification.

Dettes basses

  1. 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).
  2. Phrases types non externalisées : pause_message, error_description, etc. sont hardcodées dans le code. Doivent passer en JSON/YAML i18n-ready.
  3. 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)

  1. Phase 1 apprentissage est techniquement branchée MAIS data/learning/target_memory.db est 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.

  2. Asymétrie strict pré-vérif vs post-vérif (gros point) : le fix 7cc03f6f1 corrige no_screen_change strict → paused_need_help, mais la branche Fenêtre incorrecte en pré-vérif strict retombe toujours en retry+stop legacy. C'est une violation directe de feedback_failure_is_learning.md sur un chemin différent. Même pattern, même oubli. C'est exactement ce qui a cassé ton test chirurgical ce matin.

  3. 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, sans uia_helper.py)
    • .claude/worktrees/agent-a0ebc90f/ (migration top-level, sans replay_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.py cloud-first (violation A2) — 1-2h
  • C7 : live_session_manager.py 118 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 M non committés (diffus) — demi-journée triage
  • C12 : core/detection/vlm_config.py non 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 incorrectepaused_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)

  1. Import compound = coquille vide : 95% des edges Léa sont des actions type: compound avec 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"
  2. Pas d'auth VWB → streaming server : requests.get(...) sans header Authorization, donc streaming_server_available: false. VWB ne voit que les workflows déjà compilés (max 4 avril), pas les sessions récentes
  3. Pas de screenshots attachés : les shots/*.png de session ne sont jamais liés aux steps importés
  4. Pas de réordonnancement UI : reorderSteps existe backend + client, mais aucun composant React ne l'appelle
  5. É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
  6. Pas d'ingestion raw events : live_events.jsonl, build_replay_from_raw_events, execution_plan_to_actions ne sont pas importés dans VWB
  7. Pas de liste "sessions récentes" : aucun endpoint VWB qui liste les sess_* sur disque
  8. 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 :

  1. Liste les sessions live_sessions/*/sess_* sur disque
  2. Charge live_events.jsonl via build_replay_from_raw_events (existe déjà dans stream_processor.py:1279)
  3. Affiche la liste linéaire des actions + screenshots shots/ correspondants
  4. Checkbox "supprimer cette étape" + édition texte simple
  5. 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

  1. Vérifier sur la VM que Bloc-notes est bien fermé (ou pas), et si possible ce qui a volé le focus
  2. Lire la partie 1 de cette synthèse (résultat test chirurgical)
  3. Lire les rapports des 2 agents (sections 4)

P1 — À discuter avec moi

  1. Corriger l'incohérence Fenêtre incorrecte strict → pause apprentissage (même pattern que C)
  2. 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 ?
  3. Externaliser les phrases types en JSON i18n (petit commit)

P2 — Plus tard dans la journée

  1. Merger la migration agent_v0/ → top-level (worktree déjà prêt)
  2. Investiguer le fichier replay_failure_logger.py (importé, pas tracké)
  3. Démarrer le worker VLM pour que les sessions soient compilées en workflows

P3 — Semaine prochaine

  1. Nettoyer _a_trier/ et archives/
  2. Sync de l'agent deploy copy avec le dev
  3. 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.