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

534 lines
26 KiB
Markdown

# 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:47``docker build ... || echo "..."` (soft fail)
- `.github/workflows/cd.yml:50` — idem pour stream-server
- `veza-backend-api/.github/workflows/vulnerability-scan.yml:40``govulncheck || 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.