# Plan d'Implémentation - Détection d'Éléments UI et Fusion Multi-Modale

## Vue d'Ensemble

Ce plan implémente progressivement le système de détection d'éléments UI et de fusion multi-modale en 3 phases :
- **Phase 1 (Light)** : Structures de données et mode minimal
- **Phase 2 (Enrichi)** : Détection d'éléments basique
- **Phase 3 (Complet)** : Fusion multi-modale complète

## Tâches

- [x] 1. Phase 1 - Mode Light : Structures de Données de Base
  - Créer les structures de données UIElement et EnrichedScreenState
  - Ajouter les champs au JSON sans changer la logique existante
  - Permettre la compatibilité arrière complète
  - _Exigences: 11.1, 11.2, 11.5, 12.1, 12.4, 15.1_

- [x] 1.1 Créer les dataclasses pour UIElement
  - Implémenter UIElement avec tous les champs (element_id, type, role, bbox, label, visual, text, properties, context, tags)
  - Implémenter les sous-structures (VisualData, TextData, ElementProperties, ElementContext)
  - Ajouter les méthodes de sérialisation/désérialisation JSON
  - Implémenter la génération d'element_id stable basée sur hash(app_name + center_bbox + label_normalized)
  - _Exigences: 11.1, 11.2, 11.3, 11.4, 11.5_

- [ ]* 1.2 Écrire les tests de propriété pour UIElement
  - **Propriété 6: Stabilité des identifiants** - Pour tout UIElement créé deux fois avec mêmes paramètres, l'element_id doit être identique
  - **Propriété 32: Complétude de la structure UIElement** - Tous les champs requis doivent être présents
  - **Propriété 33: Round-trip de sérialisation UIElement** - Sérialisation puis désérialisation doit préserver tous les champs
  - _Valide: Exigences 11.1, 11.2, 11.5_

- [x] 1.3 Créer les dataclasses pour EnrichedScreenState
  - Implémenter EnrichedScreenState avec tous les champs (screen_state_id, timestamp, session_id, window, raw, perception, ui_elements, state_embedding, context)
  - Implémenter les sous-structures (WindowInfo, RawData, PerceptionData, StateEmbedding, EmbeddingComponents, ContextData)
  - Ajouter les méthodes de sérialisation/désérialisation JSON
  - Assurer la compatibilité avec l'ancien format ScreenState
  - _Exigences: 12.1, 12.2, 12.3, 12.4_

- [ ]* 1.4 Écrire les tests de propriété pour EnrichedScreenState
  - **Propriété 34: Complétude de la structure ScreenState** - Tous les champs requis doivent être présents
  - **Propriété 36: Round-trip de sérialisation ScreenState** - Les embeddings doivent être reconstruits correctement
  - **Propriété 42: Compatibilité de lecture multi-mode** - Lecture des anciens formats sans erreur
  - _Valide: Exigences 12.1, 12.4, 12.5, 15.5_

- [x] 1.5 Intégrer les nouvelles structures dans le système existant
  - Modifier le code existant pour utiliser EnrichedScreenState au lieu de ScreenState
  - Initialiser ui_elements comme liste vide par défaut
  - Initialiser state_embedding avec image_embedding uniquement (mode light)
  - Assurer que tous les workflows existants continuent de fonctionner
  - _Exigences: 9.1, 15.1_

- [ ]* 1.6 Écrire les tests de compatibilité arrière
  - **Propriété 25: Compatibilité arrière des workflows legacy** - Les anciens workflows doivent continuer à fonctionner
  - Tester que les anciens fichiers JSON sont lisibles
  - Tester que les nouveaux fichiers sont écrits avec les nouveaux champs
  - _Valide: Exigences 9.1, 9.2, 15.1_

- [x] 2. Checkpoint - Vérifier que le mode Light fonctionne
  - Assurer que tous les tests passent
  - Vérifier que les workflows existants fonctionnent toujours
  - Demander à l'utilisateur si des questions se posent

- [x] 3. Phase 2 - Mode Enrichi : Détection d'Éléments Basique
  - Implémenter le pipeline de détection d'éléments
  - Détecter les éléments pour certains écrans configurés
  - Maintenir la compatibilité avec le mode light
  - _Exigences: 1.1, 1.2, 1.3, 1.4, 1.5, 13.1, 13.2, 13.3, 13.4, 13.5, 15.2_

- [x] 3.1 Créer le composant RegionProposer
  - Implémenter la détection de zones de texte (méthode rapide)
  - Implémenter la détection de rectangles autour de texte (heuristique)
  - Implémenter la requête VLM conditionnelle pour zones cliquables (coûteux)
  - Implémenter la fusion et le nettoyage des régions (merge overlapping, filter invalid)
  - Implémenter la logique _should_use_vlm pour décider quand utiliser le VLM
  - _Exigences: 13.2_

- [ ]* 3.2 Écrire les tests pour RegionProposer
  - Tester la détection de zones de texte sur images synthétiques
  - Tester la fusion de régions qui se chevauchent
  - Tester le filtrage de régions invalides (trop petites, hors écran)
  - _Valide: Exigences 13.2_

- [x] 3.3 Créer le composant ElementCharacterizer
  - Implémenter l'extraction de crop image pour chaque région
  - Implémenter la génération d'embedding image via CLIP
  - Implémenter l'extraction de texte dans/autour de la région via VLM
  - Implémenter la génération d'embedding texte
  - Implémenter l'extraction de position bbox
  - _Exigences: 1.2, 1.3, 1.4, 13.3_

- [ ]* 3.4 Écrire les tests de propriété pour ElementCharacterizer
  - **Propriété 1: Complétude de détection d'éléments** - Tous les champs requis doivent être extraits
  - **Propriété 37: Complétude de la caractérisation** - Crop, embeddings, texte, bbox doivent être présents
  - _Valide: Exigences 1.2, 1.3, 1.4, 13.3_

- [x] 3.5 Créer le composant ElementClassifier
  - Implémenter la classification de type (button, text_input, checkbox, etc.)
  - Implémenter l'inférence de rôle sémantique (primary_action, dangerous_action, search_field, etc.)
  - Implémenter l'assignation de score de confiance
  - Utiliser les caractéristiques visuelles et l'analyse textuelle VLM
  - _Exigences: 2.1, 2.3, 2.4, 13.4_

- [ ]* 3.6 Écrire les tests de propriété pour ElementClassifier
  - **Propriété 2: Validité des types d'éléments** - Le type doit être l'un des types valides
  - **Propriété 3: Présence du score de confiance** - Score entre 0.0 et 1.0 doit être assigné
  - **Propriété 38: Complétude de la classification** - Type et rôle doivent être présents
  - _Valide: Exigences 2.1, 2.3, 2.4, 13.4_

- [x] 3.7 Créer le composant UIElementDetector principal
  - Implémenter la méthode detect_elements qui orchestre le pipeline complet
  - Intégrer RegionProposer, ElementCharacterizer et ElementClassifier
  - Implémenter la gestion d'erreurs (continuer si un élément échoue)
  - Implémenter le logging détaillé de chaque étape
  - _Exigences: 1.1, 13.1, 13.5_

- [ ]* 3.8 Écrire les tests de propriété pour UIElementDetector
  - **Propriété 1: Complétude de détection d'éléments** - Tous les éléments interactifs doivent être détectés
  - **Propriété 39: Robustesse du pipeline** - Si 1 élément échoue, les N-1 autres doivent être produits
  - _Valide: Exigences 1.1, 13.5_

- [x] 3.9 Intégrer UIElementDetector dans l'Orchestrator
  - Ajouter un appel à UIElementDetector.detect_elements lors de la capture d'écran
  - Stocker les UIElement détectés dans EnrichedScreenState.ui_elements
  - Ajouter une configuration pour activer/désactiver la détection (mode enrichi)
  - Implémenter la détection conditionnelle (seulement pour certains écrans configurés)
  - _Exigences: 15.2_

- [ ]* 3.10 Écrire les tests d'intégration pour la détection
  - Tester le pipeline complet : screenshot → UIElements
  - Tester avec différents types d'écrans (formulaires, tableaux, menus)
  - Tester la performance (< 2 secondes pour écran typique)
  - _Valide: Exigences 1.1, 10.1_

- [x] 4. Checkpoint - Vérifier que le mode Enrichi fonctionne
  - Assurer que tous les tests passent
  - Vérifier que les éléments sont détectés correctement sur des écrans de test
  - Demander à l'utilisateur si des questions se posent

- [x] 5. Phase 3 - Mode Complet : Fusion Multi-Modale
  - Implémenter le gestionnaire d'embeddings multi-modaux
  - Calculer le state_embedding fusionné avec toutes les modalités
  - Intégrer dans le workflow matcher
  - _Exigences: 4.1, 4.2, 4.3, 4.4, 4.5, 5.1, 5.2, 5.3, 5.4, 14.1, 14.2, 14.3, 14.4, 14.5, 15.3_

- [x] 5.1 Créer le composant MultiModalEmbeddingManager
  - Implémenter la méthode create_state_embedding
  - Calculer image_embedding (screenshot entier via CLIP)
  - Calculer text_embedding (texte concaténé via CLIP text)
  - Calculer title_embedding (window_title via CLIP text)
  - Calculer ui_embedding (moyenne des embeddings d'éléments importants)
  - Calculer context_embedding (vecteur de contexte workflow)
  - _Exigences: 4.1, 4.2, 4.3, 4.4, 14.1_

- [ ]* 5.2 Écrire les tests de propriété pour les composantes individuelles
  - **Propriété 7: Structure complète du state embedding** - Toutes les composantes doivent être présentes
  - **Propriété 8: Extraction de texte systématique** - Le texte doit être extrait pour tout screenshot
  - **Propriété 9: Présence du titre de fenêtre** - window_title doit être présent
  - **Propriété 10: Inclusion du contexte workflow** - Le contexte doit être inclus si disponible
  - _Valide: Exigences 4.1, 4.2, 4.3, 4.4, 14.1_

- [x] 5.3 Implémenter la normalisation des composantes
  - Normaliser chaque vecteur individuel (norme L2 = 1.0) avant fusion
  - Implémenter la méthode _normalize
  - Ajouter des assertions pour vérifier la normalisation
  - _Exigences: 4.5, 14.2_

- [ ]* 5.4 Écrire les tests de propriété pour la normalisation
  - **Propriété 40: Normalisation des composantes** - Chaque composante doit avoir norme L2 = 1.0 avant fusion
  - Tester avec différents vecteurs d'entrée
  - _Valide: Exigences 14.2_

- [x] 5.5 Implémenter la fusion pondérée des composantes
  - Implémenter la combinaison pondérée avec poids configurables
  - Poids par défaut : w_img=0.5, w_text=0.3, w_title=0.1, w_ui=0.1, w_ctx=0.1
  - Normaliser le vecteur final (norme L2 = 1.0)
  - Stocker les composantes individuelles séparément pour debug
  - _Exigences: 4.5, 14.3, 14.4, 14.5_

- [ ]* 5.6 Écrire les tests de propriété pour la fusion
  - **Propriété 11: Normalisation des embeddings** - Le vecteur final doit avoir norme L2 = 1.0
  - **Propriété 12: Dimension fixe des embeddings** - La dimension doit être constante
  - **Propriété 41: Stockage des composantes** - Les composantes doivent être stockées séparément
  - _Valide: Exigences 4.5, 5.1, 14.4, 14.5_

- [x] 5.7 Implémenter le calcul de ui_embedding
  - Filtrer les éléments importants (primary_action, is_clickable)
  - Calculer la moyenne des embeddings visuels
  - Gérer le cas où aucun élément n'est présent (retourner vecteur zéro)
  - _Exigences: 14.1_

- [x] 5.8 Implémenter le calcul de context_embedding
  - Encoder les métadonnées de contexte (workflow_id, flags métier)
  - Projeter en vecteur de dimension appropriée
  - Gérer le cas où le contexte est manquant
  - _Exigences: 4.4, 8.1, 8.4_

- [ ]* 5.9 Écrire les tests de propriété pour le contexte
  - **Propriété 22: Sensibilité au contexte** - Contextes différents doivent produire embeddings différents
  - **Propriété 23: Robustesse en absence de contexte** - Un embedding valide doit être généré même sans contexte
  - _Valide: Exigences 8.2, 8.4_

- [x] 5.10 Intégrer MultiModalEmbeddingManager dans l'Orchestrator
  - Appeler create_state_embedding lors de la capture d'écran
  - Stocker le state_embedding dans EnrichedScreenState
  - Ajouter une configuration pour activer/désactiver la fusion multi-modale (mode complet)
  - _Exigences: 15.3_

- [ ]* 5.11 Écrire les tests d'intégration pour la fusion multi-modale
  - Tester le pipeline complet : screenshot → state_embedding fusionné
  - Tester la performance (< 1 seconde pour génération d'embedding)
  - _Valide: Exigences 10.2_

- [x] 6. Checkpoint - Vérifier que le mode Complet fonctionne
  - Assurer que tous les tests passent
  - Vérifier que les state_embeddings sont générés correctement
  - Demander à l'utilisateur si des questions se posent

- [-] 7. Améliorer le WorkflowMatcher pour utiliser les éléments
  - Créer EnhancedWorkflowMatcher qui supporte le matching au niveau élément
  - Maintenir le matcher legacy pour compatibilité
  - Implémenter le routage automatique (legacy vs enhanced)
  - _Exigences: 6.1, 6.2, 6.3, 6.4, 6.5, 9.2, 9.3_

- [ ] 7.1 Créer la classe EnhancedWorkflowMatcher
  - Implémenter match_workflow_step qui route vers matching élément ou legacy
  - Implémenter _has_element_descriptors pour détecter le type de workflow
  - Implémenter _match_by_elements pour matching basé sur éléments
  - Implémenter _match_legacy pour compatibilité arrière
  - _Exigences: 6.1, 9.2, 9.3_

- [ ]* 7.2 Écrire les tests de propriété pour le routage
  - **Propriété 26: Routage correct des workflows** - Workflows avec descripteurs → matcher amélioré, sans → legacy
  - Tester avec différents types de workflows
  - _Valide: Exigences 9.2, 9.3_

- [x] 7.3 Implémenter la comparaison de state_embeddings
  - Calculer la similarité cosinus entre embeddings
  - Implémenter _compare_state_embeddings
  - Retourner un score entre 0.0 et 1.0
  - _Exigences: 5.2, 6.2_

- [ ]* 7.4 Écrire les tests de propriété pour la comparaison
  - **Propriété 13: Robustesse aux variations visuelles légères** - Similarité ≥ 0.85 pour variations légères
  - **Propriété 14: Discrimination sémantique** - Similarité ≤ 0.70 pour écrans différents
  - Tester la performance (< 100ms par comparaison)
  - _Valide: Exigences 5.2, 5.3, 5.4, 10.3_

- [x] 7.5 Implémenter la comparaison d'éléments requis
  - Implémenter _compare_required_elements
  - Implémenter _elements_match pour vérifier correspondance type/rôle/sémantique/position
  - Calculer le score de correspondance (nombre d'éléments matchés / nombre requis)
  - _Exigences: 6.1, 6.2, 6.3_

- [ ]* 7.6 Écrire les tests de propriété pour la correspondance d'éléments
  - **Propriété 16: Vérification des éléments requis** - Score < 0.5 si éléments manquants
  - **Propriété 17: Bonus des éléments optionnels** - Score augmente avec éléments optionnels
  - _Valide: Exigences 6.3, 6.4_

- [x] 7.7 Implémenter le feedback détaillé sur échec
  - Créer MatchResult avec liste de différences
  - Identifier les éléments manquants, types incorrects, positions incorrectes
  - Formater un message d'erreur lisible
  - _Exigences: 6.5_

- [ ]* 7.8 Écrire les tests de propriété pour le feedback
  - **Propriété 18: Feedback détaillé sur échec** - Liste non-vide de différences pour tout échec
  - Tester avec différents types d'échecs
  - _Valide: Exigences 6.5_

- [x] 7.9 Intégrer EnhancedWorkflowMatcher dans l'Orchestrator
  - Remplacer l'ancien WorkflowMatcher par EnhancedWorkflowMatcher
  - Passer le legacy_matcher en paramètre pour compatibilité
  - Configurer les poids de matching (weight_state, weight_elements)
  - _Exigences: 9.1, 9.2, 9.3_

- [x] 7.10 Écrire les tests d'intégration pour le matching
  - Tester le matching avec workflows legacy (compatibilité)
  - Tester le matching avec workflows enrichis (éléments)
  - Tester le routage automatique
  - _Valide: Exigences 9.1, 9.2, 9.3_

- [x] 8. Checkpoint - Vérifier que le matching amélioré fonctionne
  - Assurer que tous les tests passent
  - Vérifier que les workflows legacy fonctionnent toujours
  - Vérifier que les nouveaux workflows utilisent le matching amélioré
  - Demander à l'utilisateur si des questions se posent

- [ ] 9. Optimisations et Performance
  - Implémenter le cache pour le VLM
  - Optimiser les requêtes d'éléments
  - Ajouter des métriques de monitoring
  - _Exigences: 10.1, 10.2, 10.3, 10.4, 10.5_

- [ ] 9.1 Implémenter le cache VLM
  - Créer un cache basé sur hash du screenshot
  - Implémenter une politique d'éviction LRU
  - Persister le cache entre sessions (optionnel)
  - Mesurer le taux de cache hit
  - _Exigences: 10.4_

- [ ]* 9.2 Écrire les tests de propriété pour le cache
  - **Propriété 30: Efficacité du cache VLM** - Deuxième traitement ≤ 10% du temps du premier
  - Tester avec différents screenshots
  - _Valide: Exigences 10.4_

- [ ] 9.3 Optimiser les requêtes d'éléments
  - Créer un index sur element_id pour recherche rapide
  - Implémenter une recherche par type et rôle
  - Mesurer les temps de requête
  - _Exigences: 10.5_

- [ ]* 9.4 Écrire les tests de propriété pour la scalabilité
  - **Propriété 31: Scalabilité des requêtes** - Temps ≤ 50ms pour base de 100k éléments
  - Tester avec différentes tailles de base de données
  - _Valide: Exigences 10.5_

- [ ] 9.5 Ajouter des métriques de monitoring
  - Nombre d'éléments détectés par screenshot
  - Temps de chaque étape du pipeline
  - Taux de cache hit pour le VLM
  - Distribution des types d'éléments
  - Scores de matching moyens
  - _Exigences: 10.1, 10.2, 10.3_

- [ ]* 9.6 Écrire les tests de performance
  - **Propriété 27: Performance de détection** - ≤ 2 secondes pour écran typique
  - **Propriété 28: Performance de génération d'embedding** - ≤ 1 seconde
  - **Propriété 29: Performance de comparaison** - ≤ 100ms
  - _Valide: Exigences 10.1, 10.2, 10.3_

- [ ] 10. Outils et Utilitaires
  - Créer un outil de migration de workflows
  - Créer un mode debug visuel
  - Créer un outil de configuration
  - _Exigences: 9.4, 9.5, 15.4_

- [ ] 10.1 Créer un outil de migration de workflows
  - Convertir les workflows plein écran en workflows au niveau élément
  - Détecter automatiquement les éléments dans les anciens screenshots
  - Générer les descripteurs d'éléments
  - Sauvegarder les workflows migrés
  - _Exigences: 9.4_

- [ ] 10.2 Créer un mode debug visuel
  - Sauvegarder des screenshots annotés avec bounding boxes
  - Afficher les types et rôles détectés
  - Afficher les scores de confiance
  - Afficher les embeddings (visualisation PCA/t-SNE)
  - _Exigences: Design - Logging et Debug_

- [ ] 10.3 Créer un outil de configuration
  - Permettre la configuration via fichier YAML ou variables d'environnement
  - Configurer les modes (light, enrichi, complet)
  - Configurer les poids de fusion
  - Configurer les seuils de matching
  - Configurer l'activation du VLM
  - _Exigences: 15.4_

- [ ] 11. Documentation et Tests Finaux
  - Documenter l'API des nouveaux composants
  - Créer des exemples d'utilisation
  - Vérifier la couverture de tests
  - _Exigences: Toutes_

- [ ] 11.1 Documenter l'API
  - Documenter UIElement, EnrichedScreenState
  - Documenter UIElementDetector, MultiModalEmbeddingManager, EnhancedWorkflowMatcher
  - Créer des docstrings complètes
  - Générer la documentation API (Sphinx)
  - _Exigences: Toutes_

- [ ] 11.2 Créer des exemples d'utilisation
  - Exemple de détection d'éléments sur un screenshot
  - Exemple de génération de state_embedding
  - Exemple de matching de workflow
  - Exemple de migration de workflow
  - _Exigences: Toutes_

- [ ] 11.3 Vérifier la couverture de tests
  - Vérifier que toutes les propriétés sont testées
  - Vérifier la couverture de code (> 80%)
  - Ajouter des tests manquants si nécessaire
  - _Exigences: Toutes_

- [ ] 12. Checkpoint Final - Validation Complète
  - Assurer que tous les tests passent
  - Vérifier que toutes les exigences sont satisfaites
  - Tester sur des workflows réels
  - Demander à l'utilisateur si des questions se posent
