Files
Geniusia_v2/.kiro/specs/ui-element-detection/tasks.md
2026-03-05 00:20:25 +01:00

389 lines
19 KiB
Markdown

# 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