veza/999_FULL_AUDIT_VEZA.md
senke f64a85414c refactor: Phase 1 — SUMI token foundation
- Rewrite index.css with complete SUMI token system (dark + light themes)
- All --sumi-* variables: backgrounds, surfaces, borders, text, pigments,
  spacing, radius, shadows, glass, scrollbar, motion, z-index, layout
- shadcn/Radix semantic mapping (--background, --foreground, etc.)
- Tailwind @theme mapping with new fonts (Inter, Space Grotesk, JetBrains Mono)
- SUMI keyframe animations (sumi-fade-in, sumi-slide-up, sumi-scale-in, etc.)
- Delete 11 redundant CSS files (design-system.css, design-tokens.css,
  button.css, card.css, input.css, badge-avatar.css, header.css,
  fix-input-focus.css, fix-login-form.css, visual-enhancements.css,
  premium-utilities.css)
- Update main.tsx: single CSS import (index.css only)
- Update ThemeProvider: data-theme attribute instead of .dark class toggle
- Update index.html FOUC script: data-theme attribute

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-12 01:48:01 +01:00

26 KiB

AUDIT TECHNIQUE INTÉGRAL — MONOREPO VEZA

Date : 11 février 2026 Branche auditée : fix/audit-remediation (post-remédiation, 14 commits au-dessus de main) Auditeur : Audit indépendant — mandat comité d'investissement


EXECUTIVE SUMMARY

Veza est une plateforme audio collaborative (streaming, chat temps réel, marketplace) construite en monorepo avec un backend Go (Gin/GORM), deux services Rust (Axum pour chat WebSocket et streaming audio), et un frontend React (Vite/TypeScript/Tailwind).

Verdict global : Le produit est techniquement ambitieux et partiellement fonctionnel. Le backend Go est le composant le plus mature (sécurité solide, 80+ endpoints, JWT/CSRF/rate limiting). Les services Rust sont fonctionnels mais avec des dépendances retardataires. Le frontend est massif (971 composants, 791 fichiers features) mais contient 700+ erreurs TypeScript non résolues et 5 routes « fantômes » sans backend.

Une campagne de remédiation récente (14 commits) a significativement amélioré la posture de sécurité : authentification WebSocket du stream-server, rate limiting Redis du chat-server, durcissement des docker-compose de production, et nettoyage CI. Des vulnérabilités résiduelles subsistent dans les workflows secondaires et les dépendances Rust du stream-server.

Peut-on lancer en production ? Non sans réserve. Les 700+ erreurs TypeScript, les dépendances Rust retardataires, et les 3 || true résiduels dans la CI doivent être traités.

Peut-on maintenir ? Oui, avec un effort structuré. L'architecture est cohérente et le code est bien organisé.

Faut-il réécrire ? Non. Le code est refactorable sans réécriture.


1. CARTOGRAPHIE GLOBALE

1.1 Stack complète

Couche Technologie Version Statut
Frontend React + TypeScript 18.2 / 5.3 ⚠️ 700+ erreurs TS
Build Vite 7.1.5 Actuel
Styles Tailwind CSS 4.0.0 Actuel
State Zustand + TanStack Query 4.5 / 5.17 Bon pattern
Backend API Go + Gin + GORM 1.23.8 / 1.11 / 1.30 Actuel
Chat Rust + Axum + SQLx 0.8 / 0.7 ⚠️ SQLx retardataire
Streaming Rust + Axum + SQLx 0.8 / 0.7 ⚠️ Plusieurs deps retardataires
Base de données PostgreSQL 16 Actuel
Cache Redis 7 Actuel
Queue RabbitMQ 3 Actuel
Proxy HAProxy 2.8 Actuel
CI/CD GitHub Actions v4/v5 ⚠️ 3 || true résiduels
Conteneurs Docker + Docker Compose Multi-stage Propre
Orchestration Kubernetes Manifests présents External Secrets
Monitoring Prometheus + Grafana + Sentry Intégrés Fonctionnel

1.2 Organisation du monorepo

veza/
├── apps/web/               # Frontend React (971 composants, 791 fichiers features)
├── veza-backend-api/        # Backend Go (80+ endpoints, 31 migrations)
├── veza-chat-server/        # Service chat Rust (WebSocket, JWT, rate limiting)
├── veza-stream-server/      # Service streaming Rust (audio, HLS, WebRTC)
├── veza-common/             # Code partagé (non audité - scope limité)
├── veza-desktop/            # Application desktop (coquille vide)
├── veza-mobile/             # Application mobile (abandonné)
├── veza-docs/               # Documentation
├── .github/workflows/       # CI/CD (11 workflows)
├── docker-compose.*.yml     # 4 compose root + 2 par service + 3 infra
├── k8s/                     # Manifests Kubernetes (67 fichiers)
├── config/                  # Config infrastructure (43 fichiers)
├── migrations/              # Migrations SQL backend
└── scripts/                 # Scripts utilitaires

Outil monorepo : npm workspaces (pas Nx/Turborepo). Acceptable mais limité en fonctionnalités (pas de cache de build, pas de graph de dépendances).

1.3 Dépendances critiques

Dépendance Service Version actuelle Dernière Criticité
sqlx chat + stream 0.7 0.8.x ⚠️ Élevée
redis stream 0.25 0.32 ⚠️ Élevée
bcrypt stream 0.15 0.17 ⚠️ Moyenne
thiserror stream 1.0 2.0 ⚠️ Moyenne
dashmap stream 5.5 6.1 Faible

1.4 Schéma des flux

Browser → HAProxy (80/443)
  ├── /api/* → Backend Go (8080)
  │     ├── PostgreSQL (5432)
  │     ├── Redis (6379)
  │     └── RabbitMQ (5672)
  ├── /ws → Chat Server Rust (3000)
  │     ├── PostgreSQL
  │     ├── Redis
  │     └── RabbitMQ
  └── /stream → Stream Server Rust (3001/8082)
        ├── PostgreSQL
        ├── Redis
        └── Filesystem (audio)

2. CE QUE LE PRODUIT PERMET RÉELLEMENT

2.1 Features pleinement implémentées

Feature Backend Frontend Tests Production-ready
Authentification (email/pass)
OAuth (Google, GitHub) Partiel ⚠️
2FA (TOTP)
Gestion utilisateurs (CRUD)
Upload/gestion tracks
Streaming audio (HLS) Partiel ⚠️
Playlists (CRUD + collab)
Chat WebSocket temps réel Partiel ⚠️
Social (follow, feed, posts) Partiel ⚠️
Analytics Faible ⚠️
Webhooks Faible ⚠️
Admin dashboard Partiel ⚠️

2.2 Features partiellement implémentées

Feature Détail
Marketplace Backend endpoints présents, frontend basique, flux paiement absent
Search Backend search endpoint, frontend avec résultats partiels
Notifications Backend + WebSocket, frontend affichage sans push natif
Role management (RBAC) Backend complet, frontend admin basique

2.3 Features fantômes (frontend sans backend)

Route Composant Backend Statut
/gear LazyGear Aucun Marqué PLANNED
/live LazyLive Aucun Marqué PLANNED
/education LazyEducation MSW mock seulement Marqué PLANNED
/queue LazyQueue Aucun Marqué PLANNED
/developer LazyDeveloper Aucun Marqué PLANNED

MSW handlers pour education et gamification sont annotés « GHOST FEATURE » dans apps/web/src/mocks/handlers.ts.

2.4 Features mortes / abandonnées

Élément Localisation Statut
veza-desktop/ Racine Coquille vide, jamais développé
veza-mobile/ Racine Abandonné
gamification MSW handlers L.599 Mock uniquement, pas de backend
studio/ features/studio/ Cloud File Browser, UI seule
inventory/ features/inventory/ Gear/Inventory, UI + mocks

2.5 Incohérences produit/code

  1. 5 routes protégées mènent à des features sans backend API
  2. Gamification mockée complètement en MSW sans aucun endpoint backend
  3. ContentFilter dans le chat-server (ligne 29, security/mod.rs) renvoie toujours true — filtre désactivé
  4. 4 fichiers test legacy subsistent pour des services supprimés : src/services/__tests__/trackService.test.ts, src/services/__tests__/playlistService.test.ts, src/services/playlistService.test.ts, src/services/trackService.test.ts

3. VALIDATION FONCTIONNELLE

3.1 Flows critiques

Flow Testabilité Sécurité Gestion erreurs Verdict
Login / Register Tests présents Bcrypt + JWT + CSRF Structurée Production-ready
Upload track Tests présents Auth + Rate limit Retry + progress Production-ready
Streaming audio Partiel JWT obligatoire (C2) ⚠️ Partielle Nécessite tests E2E
Chat WebSocket Partiel JWT + Rate limit (C5) Error messages Nécessite tests charge
Payment/Marketplace Pas de tests Pas de flux paiement Non implémenté Non production-ready

3.2 Couverture de tests

Service Fichiers test Couverture estimée Qualité
Backend Go ~100+ _test.go ~70% Bonne (testcontainers)
Chat Rust 2 fichiers + modules ~30% ⚠️ Insuffisante
Stream Rust Modules #[cfg(test)] ~20% ⚠️ Insuffisante
Frontend ~100 .test.ts(x) ~40% ⚠️ Tests fragiles

3.3 Points de rupture identifiés

  1. 700+ erreurs TypeScript : le frontend ne passe pas tsc --noEmit (493 pré-existantes + 234 de noUncheckedIndexedAccess)
  2. Stream-server SQLx runtime : les queries SQL ne sont plus validées au compile-time (migration C7 de query! vers query())
  3. Chat-server ContentFilter : toujours true, aucun filtrage de contenu
  4. Rate limiting désactivé en dev (Go backend + chat-server) — peut masquer des bugs
  5. CSRF désactivé en dev (Go backend, csrf.go:44)

4. AUDIT DE SÉCURITÉ — OWASP TOP 10

A01 — Broken Access Control

Élément Gravité Statut post-remédiation
Stream-server WebSocket sans auth CRITIQUE CORRIGÉ (C2) — JWT obligatoire
user_id depuis query params CRITIQUE CORRIGÉ (C2) — extrait des claims JWT
Routes admin protégées N/A RequireAdmin() middleware
IDOR sur tracks/playlists N/A RequireOwnershipOrAdmin() middleware
RBAC backend N/A PermissionService implémenté

Gravité résiduelle : Faible. Les correctifs C2 ont éliminé la vulnérabilité critique.

A02 — Cryptographic Failures

Élément Gravité Détail
sslmode=disable en production CRITIQUE CORRIGÉ (C4) — sslmode=require
JWT secret fallback faible ÉLEVÉE CORRIGÉ (C4) — ${JWT_SECRET:?} obligatoire
DB password par défaut ÉLEVÉE CORRIGÉ (C4) — ${DB_PASS:?} obligatoire
Hashing passwords N/A Bcrypt (Go), Argon2 disponible (Rust)
JWT algorithm validation N/A HS256 strict, rejette les autres
Token expiration N/A Access 5min, Refresh 30j, versionné

Gravité résiduelle : Faible. Secrets dev dans .env (non tracké en git) — acceptable.

A03 — Injection

Élément Gravité Détail
SQL injection (Go) N/A GORM paramétré, prepared statements
SQL injection (Rust) N/A sqlx::query() avec .bind()
SQL injection testutils FAIBLE CORRIGÉ (C14) — whitelist de tables
XSS frontend N/A DOMPurify intégré (sanitize.ts)
Command injection N/A Aucun exec() ou eval() trouvé

Gravité résiduelle : Négligeable.

A04 — Insecure Design

Élément Gravité Détail
Rate limiting chat absent ÉLEVÉE CORRIGÉ (C5) — Redis + fallback mémoire
Rate limiting Go API N/A Redis + Lua scripts, par IP et user
Rate limiting stream-server MOYENNE ⚠️ NON CORRIGÉ — pas de rate limiting WebSocket
Validation serveur N/A go-playground/validator, Zod côté client
ContentFilter stub MOYENNE ⚠️ filter_content() retourne toujours true

Gravité résiduelle : Moyenne. Le stream-server manque de rate limiting WebSocket et le content filter est un stub.

A05 — Security Misconfiguration

Élément Gravité Détail
ALLOWED_ORIGINS=* stream ÉLEVÉE CORRIGÉ (C3) — domaines explicites
CORS wildcard Go API N/A Validation interdit * en production
HSTS N/A Activé en production
CSP N/A Strict pour API, relaxé pour Swagger
Debug en production N/A Conditionné par APP_ENV
.env trackés N/A Non trackés (vérifié via git ls-files)

Gravité résiduelle : Faible.

A06 — Vulnerable & Outdated Components

Composant Version Dernière Gravité
sqlx (chat + stream) 0.7 0.8.x ÉLEVÉE
redis (stream) 0.25 0.32 ÉLEVÉE
bcrypt (stream) 0.15 0.17 MOYENNE
thiserror (stream) 1.0 2.0 FAIBLE
dashmap (stream) 5.5 6.1 FAIBLE
jsonwebtoken (chat + stream) 10 10.3 Actuel
Go deps Actuelles Aucun retard
React/Vite/TS deps Actuelles Aucun retard

Gravité résiduelle : Élevée pour les dépendances Rust du stream-server. Le chat-server est globalement à jour (jsonwebtoken 10 via C6).

A07 — Identification & Authentication Failures

Élément Gravité Détail
JWT validation N/A Signature + expiration + issuer + audience
Token revocation N/A Redis-backed, session revocation
Refresh token rotation N/A Token families, anti-replay
Password reset N/A Token unique, expiration courte
2FA (TOTP) N/A Setup + verify + disable + status
Session management N/A Cookie httpOnly + auto-refresh

Gravité résiduelle : Négligeable. L'authentification est la partie la plus solide du projet.

A08 — Software & Data Integrity Failures

Élément Gravité Détail
|| true dans CI CRITIQUE ⚠️ PARTIELLEMENT CORRIGÉ — 3 instances résiduelles
continue-on-error ÉLEVÉE ⚠️ 2 instances dans vulnerability-scan.yml
actions-rs/toolchain@v1 ÉLEVÉE ⚠️ 1 instance dans production-deploy.yml
Go version CI ÉLEVÉE ⚠️ backend-ci.yml utilise encore Go 1.22
Input validation N/A Zod (frontend) + validator (backend)
Build signatures N/A Pas de signature de builds

Détail des || true résiduels :

  • .github/workflows/cd.yml:47docker build ... || echo "..." (soft fail)
  • .github/workflows/cd.yml:50 — idem pour stream-server
  • veza-backend-api/.github/workflows/vulnerability-scan.yml:40govulncheck || true

Gravité résiduelle : Moyenne. Les workflows principaux (ci.yml) sont propres, mais 3 instances résiduelles dans les workflows secondaires.

A09 — Logging & Monitoring

Élément Statut
Structured logging (Go) Logger configurable, niveaux
Structured logging (Rust) tracing crate avec spans
Audit trail audit_logs table, API access logging
Sentry error tracking Intégré (Go + frontend)
Prometheus metrics Intégré (Go + middleware)
Grafana dashboards Configurations présentes
Request correlation Request ID middleware (chat-server)

Gravité résiduelle : Négligeable. Le monitoring est bien implémenté.

A10 — SSRF

Élément Gravité Détail
Appels externes non filtrés FAIBLE Pas de fonctionnalité permettant à l'utilisateur de fournir des URLs pour des appels serveur. OAuth callbacks sont whitelistés.

Gravité résiduelle : Négligeable.


5. DETTE TECHNIQUE

5.1 Dette critique (bloquante)

ID Description Impact Fichiers
D1 700+ erreurs TypeScript (493 pré-existantes + 234 noUncheckedIndexedAccess) Impossible de valider les types en CI apps/web/tsconfig.json, centaines de fichiers .tsx/.ts
D2 Dépendances Rust stream-server retardataires : sqlx 0.7, redis 0.25, bcrypt 0.15 Risque de vulnérabilités connues veza-stream-server/Cargo.toml
D3 3 || true résiduels dans CI secondaire Masque des échecs de build/audit .github/workflows/cd.yml, vulnerability-scan.yml

5.2 Dette structurante

ID Description Impact
D4 ContentFilter stub dans chat-server — toujours true Pas de modération de contenu
D5 5 routes fantômes sans backend Confusion utilisateur, surface d'attaque inutile
D6 4 fichiers test legacy pour services supprimés Tests échouent ou sont orphelins
D7 Pas de rate limiting sur stream-server WebSocket Risque de DoS
D8 Couverture test insuffisante pour Rust services (~20-30%) Régressions non détectées
D9 .unwrap() en production dans chat-server Panics potentiels en production
D10 Code dupliqué dans JwtManager::new() et with_revocation_store_only() Maintenance dupliquée
D11 veza-desktop/ et veza-mobile/ sont des coquilles vides polluant le monorepo Confusion, surface de build inutile

5.3 Dette cosmétique

ID Description
D12 npm workspaces sans Nx/Turborepo — pas de cache de build distribué
D13 Certains composants frontend > 300 lignes
D14 Services frontend src/services/ contient encore ~67 fichiers (certains ghost)
D15 Pas de lint Rust unifié (clippy pas dans tous les workflows)

6. QUALITÉ ARCHITECTURALE

6.1 Architecture

Go Backend : Clean architecture bien respectée. Séparation handlers → services → repositories → models. Middleware stack propre. Migrations SQL idempotentes.

Rust Services : Architecture Axum standard. AppState avec Arc pour shared ownership. WebSocket handlers bien structurés. Le chat-server a un pattern plus mature que le stream-server.

Frontend : Feature-based architecture avec features/, components/, stores/, services/. TanStack Query pour le data fetching, Zustand pour le state UI. MSW pour le mocking. Storybook pour les composants.

Monorepo : npm workspaces — fonctionnel mais basique. Pas de task orchestration (Nx, Turborepo), pas de cache distribué. Les services Rust et Go sont indépendants avec leurs propres build systems.

6.2 Scores

Critère Score Justification
Architecture 7/10 Clean architecture Go, feature-based frontend, services Rust cohérents. Pénalisé par le manque de tooling monorepo (Nx/Turborepo) et les coquilles vides (desktop/mobile).
Maintenabilité 5/10 700+ erreurs TS bloquent la validation de types. Tests insuffisants pour Rust. 67 services frontend dont certains ghost. Dépendances retardataires.
Sécurité 8/10 Post-remédiation significative : JWT auth sur WS, rate limiting, CORS fixé, docker-compose durci. Pénalisé par ContentFilter stub, 3 || true résiduels, pas de rate limit stream WS.
Scalabilité 7/10 Architecture microservices avec Redis/RabbitMQ pour la communication. HAProxy en proxy. K8s manifests avec autoscaling. Pénalisé par le manque de tests de charge et le rate limiting manquant sur stream-server.

7. INFRA & DEVOPS

7.1 Docker

Élément Statut Détail
Multi-stage builds Backend Go et Rust optimisés
Non-root user Stream-server utilise un user dédié
Health checks Configurés dans tous les compose
SQLX_OFFLINE Désactivé (C7 migration runtime)
Source maps prod sourcemap: 'hidden' (non exposées)

7.2 Docker Compose

Fichier Statut Remarques
docker-compose.prod.yml sslmode=require, secrets obligatoires
docker-compose.staging.yml sslmode=require, secrets obligatoires
docker-compose.yml (dev) Passwords dev acceptables
config/docker/README.md Documentation des fichiers compose
Fichiers production.yml Supprimés (C9)

7.3 Secrets & Environnement

Élément Statut
.env trackés en git Non (vérifié)
.env.example présents Pour chaque service
.gitignore couvre .env Ligne 67
K8s External Secrets Vault/AWS/GCP stores configurés
Prod secrets hardcodés Aucun trouvé
Dev secrets hardcodés ⚠️ Présents dans docker-compose dev (acceptable)

7.4 CI/CD (11 workflows)

Workflow || true Actions version Statut
ci.yml 0 v4/v5 Propre
backend-ci.yml 0 ⚠️ Go 1.22 ⚠️ Go version
frontend-ci.yml 0 v4 Propre
chat-ci.yml 0 dtolnay Propre
stream-ci.yml 0 dtolnay Propre
cd.yml ⚠️ 2 v4 ⚠️ Soft fails
playwright.yml 0 v4 Propre
storybook-audit.yml 0 v4 Propre
test-coverage.yml 0 v5 Propre
vulnerability-scan.yml ⚠️ 1 ⚠️ continue-on-error ⚠️ À revoir
production-deploy.yml 0 ⚠️ actions-rs/toolchain@v1 ⚠️ Déprécié

8. RISQUES BUSINESS

8.1 Perspective CTO

Forces :

  • Architecture 3 services (Go + 2 Rust) est solide et scalable
  • Sécurité post-remédiation est au-dessus de la moyenne
  • Monitoring (Prometheus, Grafana, Sentry) est en place
  • K8s manifests prêts avec External Secrets

Risques :

  • 700+ erreurs TS = pas de confiance dans le typage frontend
  • 5 routes fantômes = promesses non tenues dans l'UI
  • Couverture test Rust ~25% = zone d'ombre significative
  • Un développeur principal semble avoir construit tout → risque bus factor

Verdict : Lançable en beta fermée avec les routes fantômes désactivées et un focus sur les erreurs TS critiques. Pas prêt pour une GA ouverte.

8.2 Perspective Investisseur

Points positifs :

  • Produit ambitieux et différencié (audio collab + social + marketplace)
  • Backend Go mature et sécurisé
  • Infrastructure K8s + monitoring prête
  • 80+ endpoints = surface fonctionnelle réelle

Points négatifs :

  • 5 features annoncées sans backend = dette produit
  • veza-desktop et veza-mobile abandonnés = scope mal maîtrisé
  • Gamification et éducation mockées = stratégie feature non exécutée
  • Frontend fragile (700+ erreurs TS)

Verdict : Le produit démontre une compétence technique réelle mais un scope mal contrôlé. Investissable avec un plan de réduction scope strict et une roadmap réaliste.

8.3 Perspective Acquéreur

Valeur :

  • Backend Go réutilisable tel quel
  • Architecture sécurité (JWT, CSRF, rate limiting, RBAC) de qualité
  • Infrastructure Docker/K8s prête
  • 31 migrations SQL propres = schéma DB mature

Risques d'acquisition :

  • Frontend nécessite 2-4 semaines de stabilisation TS
  • Services Rust nécessitent mise à jour dépendances (1-2 semaines)
  • Features fantômes à retirer ou implémenter
  • Bus factor (un seul contributeur probable)

Verdict : Acquérable comme base technique. Valeur dans le backend et l'infra. Frontend et Rust à stabiliser post-acquisition. Ne pas valoriser les features fantômes.


9. PLAN D'ACTION PRIORISÉ

Phase 1 — Urgent : Sécurité & Stabilité (1-2 semaines)

Action Effort Fichiers Criticité
Corriger les 3 || true résiduels dans CI S cd.yml, vulnerability-scan.yml CRITIQUE
Remplacer actions-rs/toolchain@v1 dans production-deploy.yml S production-deploy.yml:25 ÉLEVÉE
Mettre Go 1.23 dans backend-ci.yml S backend-ci.yml:27 ÉLEVÉE
Mettre à jour sqlx, redis, bcrypt dans stream-server M veza-stream-server/Cargo.toml ÉLEVÉE
Ajouter rate limiting WebSocket au stream-server M veza-stream-server/src/streaming/websocket.rs ÉLEVÉE
Corriger .unwrap() en production dans chat-server S request_id.rs:36, prometheus_metrics.rs:357 MOYENNE

Phase 2 — Stabilisation (3-4 semaines)

Action Effort Détail
Résoudre les 493 erreurs TS pré-existantes XL Fichier par fichier, prioriser features/ et services/
Implémenter le ContentFilter dans chat-server M Remplacer le stub par un vrai filtre
Supprimer ou gate les 5 routes fantômes S routeConfig.tsx — feature flags ou suppression
Supprimer les 4 fichiers test legacy S services/__tests__/, services/*.test.ts
Augmenter couverture tests Rust à 50%+ L Tests d'intégration pour WebSocket et streaming
Supprimer veza-desktop/ et veza-mobile/ S Issues séparées, pas d'impact fonctionnel
Dédupliquer JwtManager::new() dans chat-server S Extraire setup commun

Phase 3 — Amélioration (6-8 semaines)

Action Effort Détail
Résoudre les 234 erreurs noUncheckedIndexedAccess L Progressive, optional chaining
Migrer npm workspaces vers Nx ou Turborepo M Cache de build, task graph
Ajouter signature de builds dans CI/CD M Cosign ou Sigstore
Implémenter les features fantômes ou les retirer XL Décision produit : gear, live, education, queue, developer
Tests de charge WebSocket (chat + stream) L k6 ou Artillery
Audit dépendances automatisé (Dependabot/Renovate) S Configuration repo
Migrer SQLx queries runtime vers offline mode M Générer .sqlx/ avec cargo sqlx prepare

CONCLUSION STRATÉGIQUE

Veza est un projet techniquement ambitieux avec une base solide mais un scope mal contrôlé. Le backend Go est de qualité production, les services Rust sont fonctionnels mais nécessitent une mise à jour, et le frontend est massif mais fragile.

La campagne de remédiation récente (14 commits) a éliminé les vulnérabilités critiques : authentification WebSocket, durcissement docker-compose, rate limiting, nettoyage CI. La posture de sécurité est passée d'un état préoccupant à un état acceptable.

Les risques principaux restants sont :

  1. 700+ erreurs TypeScript — le frontend ne peut pas être validé statiquement
  2. Dépendances Rust retardataires dans le stream-server
  3. Features fantômes qui créent une dette produit
  4. Bus factor probable (un seul contributeur)

Recommandation finale : Le projet mérite un investissement ciblé en stabilisation (Phase 1 + 2, ~5 semaines). Il ne nécessite pas de réécriture. Avec un scope produit réaliste et la résolution de la dette TypeScript, la plateforme peut atteindre un état de beta publique en 8-10 semaines.