# Design Document - Correction Système d'Apprentissage FAISS

## Overview

Ce document décrit l'architecture de correction pour résoudre les problèmes critiques du système d'apprentissage RPA Vision V2. Après 3 jours de tests, le système ne génère aucune suggestion car l'index FAISS n'est jamais construit à partir des tâches sauvegardées. De plus, des processus zombies consomment 3GB+ RAM et l'application ne s'arrête pas proprement.

### Problèmes Identifiés

1. **Index FAISS vide** : L'index n'est jamais chargé au démarrage ni reconstruit à partir des tâches existantes
2. **Pas de chargement des tâches** : Les 19+ tâches sauvegardées ne sont jamais chargées dans l'index
3. **Processus zombies** : Les listeners pynput ne sont pas arrêtés proprement
4. **Fuite mémoire** : Boucles infinies et tensors GPU non libérés
5. **Pas de diagnostic** : Aucun outil pour comprendre l'état du système

### Solution Proposée

1. **Chargement automatique au démarrage** : Scanner et indexer toutes les tâches existantes
2. **Reconstruction d'index** : Commande pour reconstruire l'index à partir des tâches
3. **Arrêt propre** : Gestion correcte des threads et listeners
4. **Gestion mémoire** : Libération des ressources et circuit breakers
5. **Diagnostic complet** : Outil d'analyse de l'état du système

## Architecture

### Composants Modifiés

1. **EmbeddingsManager** : Ajout de méthodes de reconstruction et chargement
2. **LearningManager** : Chargement automatique des tâches au démarrage
3. **Orchestrator** : Arrêt propre des threads et listeners
4. **main.py** : Initialisation avec chargement des tâches existantes

### Nouveaux Composants

1. **FAISSIndexBuilder** : Construction et reconstruction de l'index
2. **SystemDiagnostic** : Diagnostic complet du système d'apprentissage
3. **MemoryMonitor** : Surveillance et gestion de la mémoire
4. **CircuitBreaker** : Protection contre les boucles infinies

## Components and Interfaces

### FAISSIndexBuilder

```python
class FAISSIndexBuilder:
    """Construit et reconstruit l'index FAISS à partir des tâches."""
    
    def __init__(self, embeddings_manager, learning_manager, logger):
        pass
    
    def scan_tasks(self) -> List[TaskProfile]:
        """Scanne tous les dossiers de tâches."""
        pass
    
    def load_task_embeddings(self, task: TaskProfile) -> List[np.ndarray]:
        """Charge les embeddings d'une tâche."""
        pass
    
    def rebuild_index(self) -> Dict[str, Any]:
        """Reconstruit l'index complet."""
        pass
    
    def verify_index_integrity(self) -> bool:
        """Vérifie la cohérence de l'index."""
        pass
```

### SystemDiagnostic

```python
class SystemDiagnostic:
    """Diagnostic complet du système d'apprentissage."""
    
    def check_faiss_index(self) -> Dict[str, Any]:
        """Vérifie l'état de l'index FAISS."""
        pass
    
    def count_tasks(self) -> int:
        """Compte les tâches sauvegardées."""
        pass
    
    def check_consistency(self) -> Dict[str, Any]:
        """Vérifie la cohérence tâches/embeddings."""
        pass
    
    def generate_report(self) -> Dict[str, Any]:
        """Génère un rapport JSON complet."""
        pass
```


### MemoryMonitor

```python
class MemoryMonitor:
    """Surveille et gère la consommation mémoire."""
    
    def get_current_memory(self) -> float:
        """Retourne la mémoire utilisée en GB."""
        pass
    
    def check_threshold(self, max_memory_gb: float) -> bool:
        """Vérifie si le seuil est dépassé."""
        pass
    
    def cleanup_caches(self):
        """Nettoie les caches pour libérer de la mémoire."""
        pass
    
    def free_gpu_memory(self):
        """Libère la mémoire GPU."""
        pass
```

### CircuitBreaker

```python
class CircuitBreaker:
    """Protection contre les boucles infinies."""
    
    def __init__(self, threshold: int = 100, window: float = 1.0):
        pass
    
    def record_call(self, function_name: str):
        """Enregistre un appel de fonction."""
        pass
    
    def should_break(self, function_name: str) -> bool:
        """Vérifie si le circuit doit s'ouvrir."""
        pass
    
    def reset(self, function_name: str):
        """Réinitialise le circuit breaker."""
        pass
```

## Data Models

### TaskEmbedding

```python
@dataclass
class TaskEmbedding:
    """Représente un embedding de tâche."""
    task_id: str
    embedding: np.ndarray
    metadata: Dict[str, Any]
    timestamp: datetime
```

### DiagnosticReport

```python
@dataclass
class DiagnosticReport:
    """Rapport de diagnostic du système."""
    timestamp: datetime
    faiss_index_exists: bool
    faiss_index_size: int
    tasks_count: int
    embeddings_count: int
    consistency_ok: bool
    inconsistencies: List[str]
    memory_usage_gb: float
    recommendations: List[str]
```

### MemoryStats

```python
@dataclass
class MemoryStats:
    """Statistiques mémoire."""
    total_mb: float
    used_mb: float
    available_mb: float
    percent: float
    gpu_used_mb: Optional[float]
```

## Correctness Properties

*A property is a characteristic or behavior that should hold true across all valid executions of a system-essentially, a formal statement about what the system should do. Properties serve as the bridge between human-readable specifications and machine-verifiable correctness guarantees.*

### Property 1: Index chargé au démarrage

*For any* système qui démarre avec des tâches existantes, l'index FAISS doit contenir tous les embeddings de ces tâches après l'initialisation.

**Validates: Requirements 1.1**

### Property 2: Ajout immédiat à l'index

*For any* nouvelle tâche sauvegardée, ses embeddings doivent être immédiatement présents dans l'index FAISS.

**Validates: Requirements 1.2**

### Property 3: Persistance immédiate

*For any* modification de l'index FAISS, les fichiers sur disque doivent être mis à jour dans les 5 secondes.

**Validates: Requirements 1.3**

### Property 4: Reconstruction automatique

*For any* système qui détecte des tâches sans embeddings dans l'index, la reconstruction doit être déclenchée automatiquement.

**Validates: Requirements 1.4**

### Property 5: Suggestions avec index non-vide

*For any* action similaire à une tâche existante, si l'index contient des embeddings, une suggestion doit être retournée.

**Validates: Requirements 1.5**

### Property 6: Arrêt rapide

*For any* signal d'arrêt (Ctrl+C), tous les threads doivent être arrêtés en moins de 5 secondes.

**Validates: Requirements 2.1**

### Property 7: Libération mémoire

*For any* arrêt de l'application, la consommation mémoire du processus doit diminuer de plus de 90% dans les 10 secondes.

**Validates: Requirements 2.2**

### Property 8: Arrêt synchrone des threads

*For any* arrêt demandé, aucun thread de capture ne doit rester actif après la fin de la méthode shutdown().

**Validates: Requirements 2.3**

### Property 9: Stop explicite des listeners

*For any* listener pynput actif, sa méthode stop() doit être appelée avant la fin du programme.

**Validates: Requirements 2.4**

### Property 10: Threads daemon ou arrêt garanti

*For any* thread d'orchestrateur, il doit être soit daemon, soit avoir un mécanisme d'arrêt vérifié.

**Validates: Requirements 2.5**


### Property 11: Détection de patterns répétitifs

*For any* séquence de 3 actions identiques, un pattern doit être détecté et enregistré.

**Validates: Requirements 3.1**

### Property 12: Création de tâche après pattern

*For any* pattern détecté, une tâche avec signatures doit être créée dans les 2 secondes.

**Validates: Requirements 3.2**

### Property 13: Indexation des embeddings

*For any* tâche créée, ses embeddings multimodaux doivent être présents dans l'index FAISS.

**Validates: Requirements 3.3**

### Property 14: Suggestions avec confiance élevée

*For any* action similaire (similarité > 0.8) à une tâche existante, une suggestion avec confiance > 0.7 doit être proposée.

**Validates: Requirements 3.4**

### Property 15: Contenu des suggestions

*For any* suggestion affichée, elle doit contenir le nom de la tâche et la liste des actions à effectuer.

**Validates: Requirements 3.5**

### Property 16: Limite mémoire mode shadow

*For any* exécution en mode shadow pendant plus de 5 minutes, la consommation mémoire doit rester sous 1GB.

**Validates: Requirements 4.1**

### Property 17: Limite mémoire mode assist

*For any* exécution en mode assist pendant plus de 5 minutes, la consommation mémoire doit rester sous 2GB.

**Validates: Requirements 4.2**

### Property 18: Libération GPU

*For any* génération d'embedding, la mémoire GPU utilisée doit être libérée dans les 2 secondes.

**Validates: Requirements 4.3**

### Property 19: Buffer limité

*For any* moment de l'exécution, le buffer de screenshots ne doit jamais contenir plus de 10 images.

**Validates: Requirements 4.4**

### Property 20: Alerte mémoire

*For any* dépassement du seuil de 2GB, un avertissement doit être loggé et les caches nettoyés.

**Validates: Requirements 4.5**

### Property 21: Comptage des tâches

*For any* exécution du diagnostic, le nombre de tâches retourné doit correspondre au nombre de dossiers dans user_profiles.

**Validates: Requirements 5.2**

### Property 22: Vérification de cohérence

*For any* exécution du diagnostic, toutes les tâches avec embeddings doivent avoir leurs embeddings dans l'index.

**Validates: Requirements 5.3**

### Property 23: Proposition de reconstruction

*For any* incohérence détectée (tâche sans embedding dans l'index), le diagnostic doit proposer une reconstruction.

**Validates: Requirements 5.4**

### Property 24: Rapport JSON complet

*For any* diagnostic terminé, un fichier JSON doit être généré avec toutes les métriques requises.

**Validates: Requirements 5.5**

### Property 25: Scan complet des tâches

*For any* reconstruction lancée, tous les dossiers de tâches existants doivent être scannés.

**Validates: Requirements 6.1**

### Property 26: Génération d'embeddings manquants

*For any* tâche trouvée sans embeddings dans l'index, les embeddings doivent être générés et ajoutés.

**Validates: Requirements 6.2**

### Property 27: Construction d'index optimisé

*For any* reconstruction terminée, un nouvel index FAISS doit être créé avec tous les embeddings.

**Validates: Requirements 6.3**

### Property 28: Sauvegarde après reconstruction

*For any* reconstruction réussie, les fichiers d'index et métadonnées doivent être sauvegardés sur disque.

**Validates: Requirements 6.4**

### Property 29: Résilience aux erreurs

*For any* erreur lors du traitement d'une tâche, la reconstruction doit continuer avec les tâches suivantes.

**Validates: Requirements 6.5**

### Property 30: Validation norme non-nulle

*For any* embedding généré, sa norme L2 doit être strictement positive.

**Validates: Requirements 7.1**

### Property 31: Validation NaN/Inf

*For any* embedding généré, il ne doit contenir ni NaN ni Inf.

**Validates: Requirements 7.2**

### Property 32: Cohérence embeddings identiques

*For any* paire de screenshots identiques, leurs embeddings doivent avoir une similarité cosinus > 0.95.

**Validates: Requirements 7.3**

### Property 33: Discrimination embeddings différents

*For any* paire de screenshots visuellement différents, leurs embeddings doivent avoir une similarité cosinus < 0.8.

**Validates: Requirements 7.4**

### Property 34: Régénération sur invalide

*For any* embedding invalide détecté, une erreur doit être loggée et l'embedding régénéré.

**Validates: Requirements 7.5**

### Property 35: Activation circuit breaker

*For any* fonction appelée plus de 100 fois en 1 seconde, le circuit breaker doit s'activer.

**Validates: Requirements 8.1**

### Property 36: Log circuit breaker

*For any* activation de circuit breaker, un log avec stack trace doit être créé.

**Validates: Requirements 8.2**

### Property 37: Blocage temporaire

*For any* circuit breaker activé, la fonction doit être bloquée pendant 60 secondes.

**Validates: Requirements 8.3**

### Property 38: Reprise progressive

*For any* réinitialisation de circuit breaker, un rate limit doit être appliqué à la reprise.

**Validates: Requirements 8.4**

### Property 39: Mode dégradé

*For any* situation avec 3 circuit breakers actifs simultanément, le système doit passer en mode dégradé.

**Validates: Requirements 8.5**

## Error Handling

### Stratégie Générale

1. **Erreurs de chargement** : Logger et continuer avec les tâches suivantes
2. **Erreurs d'embedding** : Régénérer jusqu'à 3 tentatives
3. **Erreurs FAISS** : Reconstruire l'index si corrompu
4. **Erreurs mémoire** : Nettoyer les caches et alerter
5. **Erreurs de thread** : Forcer l'arrêt après timeout

### Gestion des Erreurs Critiques

```python
try:
    # Opération critique
    pass
except MemoryError:
    memory_monitor.cleanup_caches()
    logger.log_critical("memory_exhausted")
except FAISSError:
    index_builder.rebuild_index()
    logger.log_critical("faiss_corrupted")
except ThreadError:
    force_shutdown_threads()
    logger.log_critical("thread_deadlock")
```

## Testing Strategy

### Unit Tests

- Test de chargement des tâches individuelles
- Test de génération d'embeddings
- Test d'ajout à l'index FAISS
- Test de recherche de similarité
- Test d'arrêt des threads
- Test de libération mémoire

### Property-Based Tests

Nous utiliserons **Hypothesis** pour Python comme bibliothèque de property-based testing. Chaque test sera configuré pour exécuter au minimum 100 itérations.

Chaque property-based test doit être tagué avec un commentaire référençant explicitement la correctness property du design document au format : `**Feature: faiss-learning-fix, Property {number}: {property_text}**`

Les tests doivent couvrir :
- Génération aléatoire de tâches et vérification de l'indexation
- Génération aléatoire d'embeddings et validation
- Simulation d'arrêts à différents moments
- Simulation de charges mémoire variables
- Simulation d'appels répétitifs pour circuit breakers

### Integration Tests

- Test du flux complet : création tâche → indexation → suggestion
- Test de reconstruction d'index avec tâches existantes
- Test d'arrêt propre avec tous les composants actifs
- Test de diagnostic sur système réel
- Test de gestion mémoire sous charge

## Implementation Notes

### Ordre d'Implémentation

1. **FAISSIndexBuilder** : Fondation pour tout le reste
2. **Chargement au démarrage** : Correction immédiate du problème principal
3. **Arrêt propre** : Correction des processus zombies
4. **MemoryMonitor** : Protection contre les fuites
5. **CircuitBreaker** : Protection contre les boucles
6. **SystemDiagnostic** : Outil de débogage

### Points d'Attention

1. **Compatibilité** : Ne pas casser le code existant
2. **Performance** : Chargement rapide au démarrage (<10s)
3. **Robustesse** : Gérer les tâches corrompues
4. **Logs** : Tracer toutes les opérations critiques
5. **Tests** : Valider chaque property avant de continuer
