Architecture technique

Comment le Connecteur
Auto-Adaptatif fonctionne

Pas de magie. Un pipeline en 5 phases. Chaque connecteur est généré, testé, validé — ou corrigé automatiquement.

Le pipeline en 5 phases

Du trafic réseau brut au connecteur fonctionnel. Entièrement automatique.

01
👁️
Sniff & Détection
~5s
Capture du trafic réseau. Identification du protocole (HTTP, SQL, Modbus, SIP, etc.). Extraction des endpoints, méthodes, headers, patterns.
02
🧠
Analyse IA
~15s
Synapse analyse le payload. Identifie l'auth, les formats de données, les codes d'erreur. Génère un modèle sémantique du service.
03
🔧
Génération
~30s
Synthèse d'un connecteur Python. Classes de mapping, handlers de sync, UI cockpit. Injection dans le sandbox.
04
🧪
Test & Validation
~20s
6 tests obligatoires. Connexion, auth, lecture, écriture, erreurs, performance. Score de compatibilité 0-100.
05
🔁
Correction ou Go
~10s
Score ≥ 80 : connecteur actif. Score < 80 : retour en phase 2 avec les erreurs. Max 3 itérations. Sinon → mode manuel.

01 — Comment NOVA détecte un nouveau service

Dès que NOVA est branchée, le moteur d'auscultation (294 signatures) scanne le réseau. Chaque équipement est identifié. Si un service est inconnu — c'est-à-dire qu'il répond sur un port mais n'a pas de signature connue — le pipeline auto-adaptatif se déclenche automatiquement.

# Étape 1 : sniff passif (tcpdump + analyse)
$ nova sniff --target 192.168.1.50:8080 --duration 10s

→ Protocole détecté : HTTP/1.1
→ Auth détectée   : Bearer token (header Authorization)
→ Format données  : JSON
→ Endpoints       : /api/v1/devices, /api/v1/readings
→ Codes erreur    : 401, 403, 429, 500

02 — Comment l'IA comprend le service

Les données brutes (headers, payloads JSON, patterns d'erreur) sont envoyées à Synapse avec un prompt spécialisé. Le noyau analyse la structure et génère un modèle sémantique du service — une description structurée de ce que fait le service, comment l'authentifier, et comment mapper les données.

# Prompt envoyé à Synapse (simplifié)
You are a connector architect. Analyze this service:

PROTOCOL: HTTP/1.1
AUTH: Bearer token in Authorization header
ENDPOINTS:
  GET /api/v1/devices → [{id, name, status, last_seen}]
  GET /api/v1/readings?device_id=X → [{timestamp, value, unit}]
ERRORS: 401=unauthorized, 429=rate_limit

Generate:
1. Service classification (what is this?)
2. Data model (fields, types, relations)
3. Sync strategy (poll? webhook? interval?)
4. Cockpit UI (what to display?)

03 — Ce qui est généré (le connecteur)

Le noyau produit un connecteur Python complet. Chaque connecteur suit une interface standard : 6 méthodes obligatoires. C'est cette standardisation qui permet à NOVA d'utiliser n'importe quel connecteur immédiatement.

# Structure standard de tout connecteur NOVA
class Connector:
    def connect(self) -> bool:      # Établit la connexion
    def authenticate(self) -> bool: # Gère l'authentification
    def discover(self) -> list:     # Découvre les ressources disponibles
    def read(self, resource) -> dict: # Lit les données
    def write(self, resource, data): # Écrit/modifie (si applicable)
    def health(self) -> str:         # Vérifie l'état du service
    def sync_schema(self) -> dict:   # Décrit le schéma pour le cockpit

Comment on vérifie qu'un connecteur fonctionne

6 tests obligatoires. Chaque connecteur doit TOUS les passer avant d'être activé.

🔌
Test 1 · Connexion
Socket ouvert ? Timeout respecté ? TLS valide si présent ?
🔑
Test 2 · Authentification
Auth acceptée ? Token rafraîchi ? Erreur 401 gérée ?
📖
Test 3 · Lecture
Données reçues ? Format conforme au modèle ? Pas de perte ?
✏️
Test 4 · Écriture
Si applicable. Écriture ok ? Confirmation reçue ? Rollback ok ?
⚠️
Test 5 · Erreurs
Timeout simulé, auth invalide, données corrompues → comportement correct ?
Test 6 · Performance
Latence < 2s ? Memory leak ? 1000 requêtes sans dégradation ?

Score de compatibilité

→ Test 1 Connexion     : ✅ (socket TCP OK, TLS validé)
→ Test 2 Authentification : ✅ (Bearer token accepté)
→ Test 3 Lecture          : ✅ (23 devices lus, 0 perte)
→ Test 4 Écriture         : ⚠️ (N/A — read-only service)
→ Test 5 Erreurs          : ✅ (401/429/500 gérés correctement)
→ Test 6 Performance      : ✅ (latence moyenne 340ms)

SCORE FINAL : 92/100 — CONNECTEUR ACTIVÉ

Si score < 80 → retour en phase 2 (max 3 corrections auto)
Si toujours < 80 après 3 itérations → mode manuel (l'humain révise)

Vos questions, nos réponses

🧬 Il s'adapte à quoi exactement ?
À tout service qui parle un protocole connu (HTTP, SQL, Modbus, SIP, MQTT, SNMP, BACnet, etc.). Si le protocole est inconnu, NOVA tente une analyse heuristique du flux binaire. Si le protocole est propriétaire et chiffré sans spécification → le connecteur est mis en file d'attente « mode manuel ».
🔍 Comment il SAIT qu'il doit s'adapter ?
Le moteur d'auscultation scanne le réseau en continu. Quand il trouve un service actif qui ne correspond à aucune des 294 signatures cellulaires connues, il déclenche le pipeline. C'est automatique. L'utilisateur peut aussi lancer un scan manuel : nova adapt 192.168.1.50:8080.
📡 Comment il communique avec le service ?
Le connecteur généré utilise les bibliothèques natives du protocole. HTTP → httpx. SQL → sqlalchemy. Modbus → pymodbus. SIP → pjsua2. MQTT → paho-mqtt. Chaque connecteur est un micro-service isolé dans un conteneur Docker dédié, avec son propre réseau, ses propres credentials, et son propre cycle de vie.
✅ Est-ce que ça marche tout de suite ?
Statistiquement : 85% des services détectés sont des protocoles standards connus → le connecteur est fonctionnel en moins de 90 secondes. Les 15% restants (protocoles propriétaires, chiffrés, exotiques) nécessitent une intervention humaine ou une spécification. Le connecteur n'est JAMAIS activé sans avoir passé les 6 tests. S'il échoue, il reste en sandbox.
🔄 Est-ce qu'il apprend de ses erreurs ?
Oui. Chaque échec est loggé et réinjecté dans le prompt de Synapse au cycle suivant. Le noyau voit les erreurs, les analyse, et corrige le connecteur. C'est un système immunitaire adaptatif : plus NOVA voit de services, plus elle devient performante à en reconnaître de nouveaux.
👤 Que fait l'humain quand l'auto-adaptatif échoue ?

Après 3 échecs consécutifs du pipeline auto-adaptatif, NOVA passe en mode assistance humaine. Elle ne bloque pas — elle prépare un dossier d'intervention complet.

Dossier d'intervention généré automatiquement

📋 DOSSIER D'INTERVENTION #NOVA-2026-0781
─────────────────────────────────────────────
Service    : 192.168.1.50:8443
Protocole  : TCP/TLS, payload binaire propriétaire
Détecté le : 06/07/2026 14:32
Tentatives : 3 échecs
Score max  : 41/100 (Tentative 2)

📦 FICHIERS ATTACHÉS
├── capture.pcap           (trafic brut, 30s)
├── tentative_1/           (logs + code généré)
├── tentative_2/           (meilleure tentative)
├── tentative_3/           (logs + code généré)
└── analyse_deepseek.json  (modèle sémantique)

🔍 CE QUE NOVA A COMPRIS
├── Protocole probable : Modbus TCP (confiance 72%)
├── Structure trame      : partiellement identifiée
├── Auth                 : non détectée
└── Raison échec         : payload binaire non standard

❓ CE DONT NOVA A BESOIN
├── [ ] Spécification du protocole (PDF, doc, RFC)
├── [ ] Credentials de test (login/mdp ou token)
├── [ ] Accès direct au service pour test
└── [ ] Exemple de payload valide (requête + réponse)

L'humain peut alors :

🔧 Option 1 — Fournir la spec : uploader un PDF/RFC/documentation du protocole. Synapse le lit et retente la génération avec ce contexte supplémentaire.

✏️ Option 2 — Éditer le connecteur : ouvrir le code généré (tentative_2, le meilleur score) et le corriger manuellement dans l'éditeur intégré du cockpit.

🔐 Option 3 — Fournir des credentials : entrer un login/mdp ou token de test pour que NOVA puisse interagir avec le service et apprendre de ses réponses.

📡 Option 4 — Donner accès : autoriser NOVA à se connecter directement au service. Elle observe les vrais échanges et affine le connecteur.

🧬 Option 5 — Écrire un template : si le protocole est totalement inconnu, l'humain peut écrire un squelette de connecteur manuellement. NOVA l'utilise comme base pour les futurs services similaires.

Toutes les difficultés rencontrées

10 catégories d'échecs. Une stratégie pour chacune.

🔒 1. Protocole propriétaire sans spécification (40% des échecs)
Le service parle un protocole non documenté : firmware OT, automate chinois, API interne d'éditeur. Résolution : besoin d'une spec PDF, d'un exemple de payload, ou d'un accès à la doc constructeur. Sans ça, impossible de deviner la structure.
🔐 2. Chiffrement opaque (20%)
TLS avec mutual auth, certificat auto-signé non exportable, VPN obligatoire avant d'atteindre le service. Résolution : l'humain fournit le certificat client, ou déverrouille temporairement l'accès pour le scan.
🪪 3. Authentification exotique (12%)
Kerberos, NTLMv2, SAML custom, OAuth2 avec PKCE, client certificate, token hardware (YubiKey, smartcard). Résolution : credentials de test fournis par l'humain, ou mode "read-only" sans auth.
📦 4. Format de données non standard (10%)
Binaire propriétaire, ASN.1 encodé, EDI (EDIFACT, X12), Protocol Buffers sans .proto, SOAP avec WS-Security, HL7 v2 non standard. Résolution : Synapse tente un parsing heuristique. Si échec → spec du format requise.
🔄 5. Protocole stateful avec séquence complexe (6%)
Le service exige un handshake multiphase : login → select database → execute query → fetch results. Chaque étape dépend de la précédente. Résolution : Synapse modélise la machine d'état. Si trop complexe → capture de session par l'humain.
⏱️ 6. Rate limiting agressif (4%)
Le service bloque après 3-5 requêtes, impose 1 req/min, ou bannit l'IP après échec d'auth. Résolution : NOVA espace automatiquement les tentatives. Si l'IP est blacklistée → l'humain whitelist l'IP de NOVA.
💥 7. Service instable ou non déterministe (3%)
Timeout aléatoires, données incohérentes, race conditions, réponses qui changent sans logique apparente. Résolution : NOVA fait 5 tentatives et augmente le timeout. Toujours instable → marqué "dégradé".
🔗 8. Dépendances cachées (2%)
Le service nécessite un DNS interne, un LDAP, un serveur de licence, ou un autre service pour fonctionner. Résolution : NOVA détecte les échecs de résolution. L'humain fournit la config réseau manquante.
🔤 9. Encodage non standard (2%)
EBCDIC (mainframe IBM), UTF-16 LE/BE, Shift-JIS, compression LZ4/zstd propriétaire. Résolution : Synapse force-brute les décodeurs connus. Si échec → l'humain précise l'encodage.
⚡ 10. Protocole temps réel ou streaming (1%)
WebSocket propriétaire, streaming binaire continu, RTSP avec codec exotique, bus CAN avec IDs non documentés. Résolution : capture d'échantillon. L'humain identifie le type de flux. Template semi-automatique.

Matrice de résolution

┌─────────────────────────────┬────────┬──────────────────────────┐
│ DIFFICULTÉ                  │ FRÉQ.  │ RÉSOLUTION               │
├─────────────────────────────┼────────┼──────────────────────────┤
│ Protocole propriétaire      │  40%   │ 👤 Spec ou doc requise    │
│ Chiffrement opaque          │  20%   │ 👤 Certificat ou accès    │
│ Authentification exotique   │  12%   │ 👤 Credentials de test    │
│ Format non standard         │  10%   │ 🤖👤 Parsing + spec       │
│ Stateful complexe           │   6%   │ 🤖 Machine d'état         │
│ Rate limiting               │   4%   │ 🤖 Backoff automatique    │
│ Service instable            │   3%   │ 🤖 Retry + mode dégradé   │
│ Dépendances cachées         │   2%   │ 👤 Config réseau          │
│ Encodage non standard       │   2%   │ 🤖 Force-brute décodeurs │
│ Streaming / temps réel      │   1%   │ 👤 Identification manuelle│
├─────────────────────────────┼────────┼──────────────────────────┤
│ 🤖 Automatique              │  13%   │ Zéro humain              │
│ 👤 Assistance humaine       │  72%   │ 5 options disponibles    │
│ 🤖👤 Mixte                  │  15%   │ Auto + validation        │
└─────────────────────────────┴────────┴──────────────────────────┘

TOTAL : 85% résolus automatiquement. 15% nécessitent l'humain.
Le taux s'améliore à chaque nouveau connecteur créé.

La solution qui contourne 60% des difficultés

Une seule approche architecturale qui rend 6 des 10 problèmes caducs. Le Connecteur Passif par Observation.

🔬 Mode Apprentissage Passif — Le MITM transparent

Au lieu d'interroger le service (mode actif), NOVA observe les échanges réels entre le client légitime et le service (mode passif). Elle s'intercale comme un proxy transparent, déchiffre le trafic, et apprend du vrai comportement — sans jamais perturber le service.

┌─────────────────────────────────────────────────────────────┐
│           MODE PASSIF — APPRENTISSAGE PAR OBSERVATION        │
│                                                              │
│  ┌──────────┐     ┌──────────────┐     ┌──────────────┐     │
│  │ Client    │────▶│  NOVA PROXY  │────▶│  Service      │     │
│  │ légitime  │◀────│  (MITM)      │◀────│  legacy       │     │
│  └──────────┘     └──────┬───────┘     └──────────────┘     │
│                          │                                    │
│                          ▼                                    │
│                   ┌──────────────┐                           │
│                   │  OBSERVATION │                            │
│                   │  + APPRENTI- │                            │
│                   │  SSAGE       │                            │
│                   └──────┬───────┘                           │
│                          │                                    │
│                          ▼                                    │
│                   ┌──────────────┐                           │
│                   │  CONNECTEUR  │                            │
│                   │  GÉNÉRÉ      │                            │
│                   └──────────────┘                           │
│                                                              │
│  Ce que NOVA capture :                                       │
│  ▸ Requêtes réelles (pas des probes)                         │
│  ▸ Réponses réelles (pas des erreurs)                        │
│  ▸ Séquence exacte des échanges                              │
│  ▸ Authentification réelle (token, session)                  │
│  ▸ Payloads en clair (après déchiffrement TLS)               │
│  ▸ Gestion d'erreurs réelle                                  │
│  ▸ Timing et patterns d'usage                                │
└─────────────────────────────────────────────────────────────┘
🔒
Contourne #1
Protocole proprio → pas besoin de comprendre, on observe
🔐
Contourne #2
Chiffrement → proxy déchiffre avec son propre certificat
🪪
Contourne #3
Auth exotique → le client s'authentifie, NOVA observe
📦
Contourne #4
Format non standard → payloads réels capturés
🔄
Contourne #5
Stateful → séquence réelle observée, pas devinée
⏱️
Contourne #6
Rate limit → passif, zéro requête générée

Résultat : 60% des difficultés contournées. Le connecteur est généré à partir de vrais échanges — pas de probes, pas de devinettes, pas de rate limiting. C'est le mode le plus fiable pour les protocoles inconnus.

🔧 Comment activer le mode passif

# Option A — NOVA comme proxy transparent
$ nova proxy --target 192.168.1.50:443 --listen 8443
→ Le client pointe vers NOVA:8443 au lieu du service
→ NOVA déchiffre, observe, forwarde
→ Temps d'observation recommandé : 5-10 minutes

# Option B — NOVA sniff le trafic (mode promiscuous)
$ nova sniff --interface eth0 --host 192.168.1.50 --duration 10m
→ Capture passive sur le switch (port mirroring)
→ Zéro modification du réseau existant
→ Extraction des patterns après capture

# Option C — Import d'un PCAP existant
$ nova learn --pcap capture.pcap --host 192.168.1.50
→ Upload d'une capture Wireshark/tcpdump
→ Synapse analyse hors ligne
→ Connecteur généré sans accès direct au service

📊 Impact sur le taux de succès

┌──────────────────────────┬──────────┬──────────┬──────────┐
│ MODE                     │ SUCCÈS   │ ÉCHEC    │ HUMAIN   │
├──────────────────────────┼──────────┼──────────┼──────────┤
│ Actif seul (sniff+probe) │    85%   │    15%   │ requis   │
│ Passif (proxy/sniff)     │    96%   │     4%   │ optionnel│
│ Passif + Actif (combiné) │    99%   │     1%   │ rarissime│
└──────────────────────────┴──────────┴──────────┴──────────┘

AVEC le mode passif : 99% des services → connecteur fonctionnel.
Les 1% restants = protocoles air-gapped ou physiquement inaccessibles.