Lenteur du calcul de la règle de distance (calcul WoT 100% côté client)
Labels : bug, p2
Description :
## Symptôme
Le calcul de la **règle de distance** (évaluation d'adhésion) est très lent pour les utilisateurs.
## Diagnostic
Contrairement à l'hypothèse initiale (requête `durt2` mal optimisée ou index `squid` manquant), le calcul **n'utilise ni squid ni GraphQL**. Il est fait **100 % côté client** (`lib/services/distance_service.dart`) :
1. **Téléchargement de toute la toile de confiance** par RPC brut (`state_queryStorageAt`). `fetchWotData` itère sur _toutes_ les identités jamais créées (`identity.nextIdtyIndex()`), récupère par lots de 1000 les clés + adhésions, puis par lots de 500 les `certsByReceiverKey` de **chaque** identité → des dizaines d'appels RPC qui rapatrient l'intégralité des certifications. Le temps dépend surtout de la latence/bande passante du nœud contacté.
2. **Traitement synchrone sur l'isolate UI** : décodage SCALE de toutes les certifications + **deux** parcours DFS récursifs (profondeur 5 pour la distance, 4 pour la qualité), aucun `Isolate.run` → gèle potentiellement l'interface.
3. **Aucun timeout** sur les `queryStorageAt` : un nœud lent = barre de progression bloquée indéfiniment.
4. Le graphe est mis en cache (TTL 3 h) et déclenché au tap → le coût est celui du **premier calcul**, pas de recalculs intempestifs.
## Pistes d'optimisation
**Côté Ğecko (faisable rapidement) :**
- déplacer décodage SCALE + DFS dans un isolate (dégèle l'UI) ;
- fusionner les deux DFS (le sous-arbre profondeur 4 est inclus dans celui de profondeur 5) → coût CPU /2 ;
- ajouter des timeouts sur les requêtes RPC.
**Côté infra (levier radical) :**
- si `squid` pouvait exposer les **referees / l'évaluation de distance pré-calculés** (ou au moins indexer le graphe de certifications), une requête GraphQL remplacerait tout le téléchargement RPC. → **Question : squid peut-il exposer un endpoint distance/referees ?**
## Références code
- `lib/services/distance_service.dart` — `fetchWotData`, `computeDistanceAndQuality`, `_distanceRuleRecursive`
- `lib/providers/distance_provider.dart` — cache + déclenchement
- `lib/widgets/distance_quality_section.dart` — UI
issue