veza/docs/archive/root-md/REPORT_AUDIT_2025_12_07.md
senke 43af35fd93 chore(audit 2.2, 2.3): nettoyer .md et .json à la racine
- Archiver 131 .md dans docs/archive/root-md/
- Archiver 22 .json dans docs/archive/root-json/
- Conserver 7 .md utiles (README, CONTRIBUTING, CHANGELOG, etc.)
- Conserver package.json, package-lock.json, turbo.json
- Ajouter README d'index dans chaque archive
2026-02-15 14:35:08 +01:00

6.8 KiB

🔥 RAPPORT D'AUDIT TECHNIQUE - VEZA

Date : 2025-12-07 (J+1 après Audit Précédent) Auditeur : Antigravity Scope : Full Stack (Go, Rust, React, Infra)


📌 1. SYNTHÈSE EXÉCUTIVE : "La Façade est Solide, le Moteur Sonnanote dans le Vide"

En 24 heures, le projet a fait un bond spectaculaire en stabilité. Les problèmes critiques qui menaçaient l'infrastructure (Sleep bloquant dans les workers Go, migrations legacy dangereuses, tests désactivés) ont été CORRIGÉS. Le backend et le chat server sont désormais techniquement sains et robustes.

Cependant, cette stabilité révèle une vérité plus inquiétante sur le Stream Server : sa fonctionnalité cœur (la synchronisation multi-clients précise) est actuellement SIMULÉE. Le code utilise des nombres aléatoires pour calculer le "drift" et ne communique pas réellement les ajustements aux clients.

Verdict : Nous sommes passés d'un projet "Instable" à un projet "Stable mais Partiellement Factice". L'urgence n'est plus de réparer des crashs, mais d'implémenter la vraie logique métier qui a été mockée pour le MVP.


🗺️ 2. CARTOGRAPHIE DÉTAILLÉE PAR SERVICE

🟢 Backend API (veza-backend-api) - ÉTAT : SAIN & STABILISÉ

Le nettoyage a été efficace. Le code est propre, l'architecture hexagonale respectée.

  • Workers : FIXÉ. Le JobWorker (L161 job_worker.go) utilise désormais un polling propre (Ticker 1s) et ne bloque plus le thread. Le sleep dangereux a disparu.
  • Migrations : FIXÉ. Le dossier toxique migrations_legacy a été éradiqué. Seule la source de vérité prévaut.
  • Tests : FIXÉ. room_handler_test.go est actif et passe.
  • Architecture : Clean Architecture respectée.
  • Point de vigilance : La dépendance à context.WithTimeout(5m) dans les jobs est correcte mais peut créer des files d'attente si le volume explose.

🟢 Chat Server (veza-chat-server) - ÉTAT : ROBUSTE

Infrastructure WebSocket solide.

  • Heartbeat : PRÉSENT. La boucle handle_socket (L125 handler.rs) gère correctement un keepalive_timeout de 60s et répond aux Pings. Ce n'est plus un risque de fuite de connexions.
  • UUID : Migration complète et cohérente.
  • Architecture : Claire, modulaire (websocket, services, repository).

🔴 Stream Server (veza-stream-server) - ÉTAT : FONCTIONNEL MAIS SIMULÉ (FAÇADE)

C'est ici que se concentre la dette "fonctionnelle" invisible. Le serveur tourne, mais il "ment" sur ce qu'il fait.

  • Synchronisation (SyncEngine) : SIMULÉE.
    • Dans src/core/sync.rs, la méthode calculate_drift retourne rand::random::<f64>() * 20.0 - 10.0. Le drift est un nombre aléatoire ! Il ne mesure rien.
    • La méthode apply_sync_adjustment (L550) contient un TODO: Implémenter l'envoi réel via la connexion WebSocket et n'envoie rien.
  • Abort Safety : ⚠️ Usage de handle.abort() confirmé dans prometheus_metrics.rs, mais c'est acceptable pour des métriques. Le risque de perte de données sur le transcodage reste théorique tant que le transcodage lui-même n'est pas audité sous charge.

🟡 Frontend (apps/web vs veza-desktop) - ÉTAT : SCHIZOPHRÉNIE LÉGÈRE

  • Apps/Web : Moderne (Vite, React 18), actif, structuré. C'est clairement la cible.
  • Veza Desktop : Codebase existante mais potentiellement redondante. Risque de double maintenance inutile si ce n'est pas juste un wrapper d'Electron autour de la WebApp.

🚨 3. TOP PROBLÈMES PRIORITAIRES (P0/P1)

Voici la nouvelle liste des priorités, débarrassée des faux problèmes corrigés hier.

ID Sévérité Thème Description Zone Impactée
P0 🔴 CRITIQUE Fake Implementation Simulation du Drift Audio. Le calcul de synchronisation est basé sur rand(). La fonctionnalité clé de Veza ("écoute synchronisée parfaite") est une illusion. veza-stream-server/src/core/sync.rs
P1 🟠 MAJEUR Not Implemented WebSockets Muets (Stream). Le serveur calcule (simule) des ajustements mais ne les envoie PAS aux clients (TODO L550). Le client ne recevra jamais l'ordre de se recaler. veza-stream-server/src/core/sync.rs
P2 🟡 MOYEN Architecture / DX Ambiguïté Desktop. Présence de veza-desktop avec son propre code source React vs apps/web. Risque de divergence fonctionnelle et double effort. veza-desktop/
P2 🟡 MOYEN Testing Manque de Tests de Charge Stream. Avec une logique de sync simulée, impossible de savoir comment le système réagira avec 100 vrais clients ayant de vrais drifts réseaux. veza-stream-server

🌋 4. CAUSES PROFONDES & ANALYSE

  1. "Demo-Driven Development" : La simulation rand() suggère que le Stream Server a été construit pour passer une démo ou un POC (Proof of Concept) rapidement, en montrant des graphiques qui bougent, sans implémenter la complexité réelle de la mesure NTP/Audio clock.
  2. Focalisation sur le "Plomberie" : L'équipe (ou les sprints récents) s'est concentrée, avec succès, sur la stabilité (ne pas crasher, gérer la DB, Auth). Maintenant que les fondations sont saines, le "vide" fonctionnel du moteur audio devient visible.
  3. Nettoyage Efficace : Il faut saluer le fait que la dette technique "sale" (legacy migrations, bad sleep) a été traitée très vite. Le projet est propre, il est juste "incomplet".

🧭 5. RECOMMANDATIONS & ROADMAP (Suggérée)

Ne touchez plus au Backend Go ni au Chat Server pour l'instant. Ils sont "Good Enough".

FOCUS ABSOLU : STREAM SERVER REALITY

  1. Semaine 1 : Réalité de la Synchro

    • Supprimer rand::random dans sync.rs.
    • Implémenter une vraie mesure de drift basée sur les timestamps (Client Timestamp vs Server Timestamp).
    • Câbler l'envoi WebSocket réel des ajustements (apply_sync_adjustment).
  2. Semaine 2 : Consolidation Frontend

    • Clarifier le statut de veza-desktop. Si possible, le remplacer par un wrapper Electron qui charge apps/web, et archiver le code React dupliqué.
    • Vérifier que le Frontend Web réagit réellement aux messages WebSocket de synchronisation (maintenant qu'ils vont être envoyés).
  3. Semaine 3 : Validation Réelle

    • Tester l'écoute synchronisée avec 2 navigateurs réels. Vérifier que si l'un lag, il reçoit l'ordre de seek/speed up.

Message au CTO :

"Le bâtiment ne risque plus de s'effondrer (Backend/Infra solidifiés). Cependant, nous vendons un système de "Synchronisation Audio Haute Fidélité" qui est actuellement un générateur de nombres aléatoires. La priorité absolue est d'arrêter de simuler et de brancher la vraie logique de mesure de temps."