● Jalon 2 fini et poussé dans durt!15, qui porte maintenant les jalons 2 et 3 d’un seul tenant (pas de branche empilée, pas de branche morte).
Ce qui est fait
Type d’endpoint. EndpointType.dunipod est un troisième type, pas une variante de squid. Le compilateur a listé les 5 switch non exhaustifs, tous traités :
- chargeurs d’amorces (registre, bootstrap, découverte) → config/dunipod_endpoints.json ;
- le switch du peering → const : un nœud Duniter n’annonce jamais de pod, donc rien n’en sort ;
- le testeur d’endpoint → délègue à la sonde de la découverte, au lieu d’en écrire une deuxième copie du contrat dunipodStatus.
Le piège que ça a révélé. getCustomEndpoint faisait type == rpc ? ‘customEndpoint’ :
‘customIndexer’ : ajouter dunipod lui donnait silencieusement la case de Squid. Un pod et un Squid ne parlent pas le même schéma — chaque requête serait partie au mauvais serveur, et la première adresse posée aurait disparu. Trois cases distinctes maintenant.
Classement. La fraîcheur d’abord, la latence ensuite, avec un seuil de 6 s entre les deux.
La mesure sur les trois pods gtest justifie le seuil : même bloc, 4/4/5 s de retard, mais 286 / 287 / 539 ms de latence. Sans seuil, 1 s de bruit de mesure aurait décidé à la place de 250 ms réels. Au-delà d’une demi-heure de retard le pod est refusé : il répond vite et faux.
Échecs récents. Mise de côté 30 s, doublant jusqu’à 15 min — sauf si tous les pods refroidissent en même temps, auquel cas c’est notre connexion qui est en cause et on réessaie quand même.
Pod imposé (le point que l’issue demandait de trancher) : il gagne sur un plus rapide, il n’est jamais effacé pour une panne (la sonde a pu tourner hors ligne), un autre prend le relais par défaut, et qui l’a imposé exprès peut refuser tout remplaçant. J’ai signalé dans la MR que le connecteur Squid actuel, lui, efface le réglage de l’utilisateur dans ce cas — allowFallbackFromCustom est écrit pour les deux types si poka veut aligner Squid plus tard.
Mode explicite. Durt.i.connectDunipod() existe et est atteignable, mais rien ne sélectionne un pod tant qu’on ne le demande pas : les lectures passent toujours par Squid.
C’est le jalon 6 qui bascule.
Vérifications
flutter analyze propre, 414 tests au vert dont 16 nouveaux, plus la sonde contre les trois vrais pods gtest.
Un test existant a cassé et je l’ai corrigé plutôt que contourné :
endpoint_registry_test.dart affirmait EndpointType.values.length == 2.
Reste sur #252 : la moitié du jalon 3 (en-têtes RateLimit, budget partagé, arbitrage attendre/dégrader/changer de pod), puis les jalons 4, 5, 6. Et la question ouverte pour poka tient toujours : aucun pod Dunipod Ğ1 connu, donc le jalon 6 n’a rien à viser sur la Ğ1.