veza/docs/PLAN_ACTION_AUDIT.md
senke edde637c8e feat(v0.501): Sprint 4 -- Cloud frontend + Gear advanced
- C1-09: Create CloudPage with folder tree, file list, and /cloud route
- C1-10: Create CloudUploadModal with drag-and-drop and progress
- C1-11: Create CloudFilePreview mini player inline
- C1-12: Add Cloud stories (loading, empty, populated, quota full)
- G1-01: Add is_public toggle, public gear endpoint, GearShowcase
- G1-02: Add gear image upload endpoints, GearImageGallery component
- G1-03: Add gear search with ILIKE + SearchBar in toolbar
- G1-04: Add stories for GearShowcase and GearImageGallery
2026-02-22 18:30:49 +01:00

15 KiB
Raw Blame History

Plan d'action post-audit — Veza Monorepo

Date : 2026-02-22 Base : AUDIT_TECHNIQUE_2026-02-22.md (Cursor/Claude 4.6 Opus) Périmètre : v0.404 (stabilisation) + préparation v0.501


Légende

Symbole Signification
🔴 Bloquant production — doit être corrigé avant tout déploiement
🟠 Élevé — doit être corrigé avant la fin de v0.404
🟡 Moyen — planifiable en v0.404 ou début v0.501
S < 1 jour
M 13 jours
L 35 jours
XL > 5 jours

Sprint 1 — Sécurité critique (jours 15)

Objectif : Éliminer les vulnérabilités exploitables. Aucune feature, aucun refactoring.

# Ticket Gravité Effort Fichiers impactés Critère de complétion
001 Fixer pipeline CD — remplacer if: secrets.* par if: vars.* dans les conditions GitHub Actions. Ajouter needs: ci sur le job deploy. Pointer sur Dockerfile.production. 🔴 S .github/workflows/cd.yml Pipeline CD exécute push+deploy sur merge main
002 Auth Redis production — ajouter --requirepass $REDIS_PASSWORD au service Redis dans le compose prod. Propager REDIS_PASSWORD dans les env du backend et des services Rust. 🔴 S docker-compose.prod.yml, config.go (Redis init), chat-server/config.rs, stream-server/config.rs Redis refuse les connexions sans mot de passe
003 Fixer auth HLS/WebSocket — implémenter un endpoint POST /auth/stream-token qui génère un token éphémère (5 min, usage unique, scope streaming). Le frontend l'utilise en query param pour WS et HLS au lieu de TokenStorage.getAccessToken(). 🔴 M Backend : nouveau handler auth/stream_token.go, middleware stream auth. Frontend : hlsService.ts, websocket.ts, tokenStorage.ts HLS playback et WebSocket chat fonctionnent avec auth valide
004 Supprimer docker-compose.hybrid.yml ou retirer network_mode: host + changer le mot de passe Grafana par défaut 🔴 S docker-compose.hybrid.yml Fichier supprimé ou sécurisé
005 JWT_SECRET pour stream-server — ajouter la variable dans le compose prod, vérifier que le stream-server valide les tokens avec le même secret que le backend 🔴 S docker-compose.prod.yml:217, stream-server/config.rs Stream-server rejette les requêtes sans JWT valide
006 Fixer IDOR GetUploadStatus — ajouter vérification upload.user_id == authenticated_user.id 🟠 S internal/handlers/upload.go:308 Un user ne peut voir que ses propres uploads
007 Validation SSRF webhooks — whitelist schémas (https uniquement), bloquer IPs privées (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 127.0.0.0/8, 169.254.0.0/16) dans le webhook delivery service 🟠 S webhook_handlers.go, webhook delivery service Les webhooks ne peuvent cibler que des URLs publiques HTTPS
008 Vérifier signature webhook Hyperswitch — implémenter validation HMAC-SHA256 sur le handler de callback paiement. Rejeter tout webhook sans signature valide. 🟠 M Handler webhook paiement (localiser dans internal/handlers/) Webhooks sans signature valide retournent 401
009 Unifier version Go — 1.24 dans go.mod, go.work, CI workflows (ci.yml, backend-ci.yml), et Dockerfile.production 🟠 S go.mod, go.work, .github/workflows/ci.yml, .github/workflows/backend-ci.yml, Dockerfile.production go version identique partout
010 Migrer secrets CI — déplacer toute credential en clair dans les workflows vers GitHub Secrets. Vérifier qu'aucun secret ne reste dans les fichiers YAML. 🟠 S .github/workflows/*.yml grep -r "password|secret|token" .github/ ne retourne rien de sensible

Livrable Sprint 1 : Tag v0.404-alpha1. Les 5 blocages critiques de l'audit sont résolus.


Sprint 2 — Infra & CI/CD (jours 612)

Objectif : Rendre le pipeline de déploiement fiable et le monitoring opérationnel.

# Ticket Gravité Effort Fichiers impactés Critère de complétion
011 Migrer rate limiter vers Redis — remplacer le rate limiter in-memory par un rate limiter basé sur Redis (clé ratelimit:{user_id}:{route}, TTL sliding window). Conserver le fallback in-memory si Redis est down. 🟠 M internal/middleware/ratelimit.go, internal/config/config.go Rate limiting fonctionne en multi-instance. Test : 2 instances, la limite s'applique globalement.
012 Aligner PostgreSQL 16 partout — remplacer postgres:15-alpine par postgres:16-alpine dans test et hybrid composes 🟠 S docker-compose.test.yml, docker-compose.hybrid.yml Toutes les composes utilisent PG 16
013 Fixer frontend-ci.yml — ajouter étapes lint (eslint), typecheck (tsc --noEmit), build (vite build) 🟠 S .github/workflows/frontend-ci.yml Les PRs frontend échouent si lint, typecheck ou build échouent
014 Ajouter go vet et gofmt en CI — étape dédiée dans le workflow backend 🟡 S .github/workflows/backend-ci.yml go vet ./... et gofmt -l . exécutés en CI
015 Ajouter clippy en CI pour les services Rust 🟡 S .github/workflows/ci.yml (ou nouveau rust-ci.yml) cargo clippy -- -D warnings exécuté en CI pour chat + stream
016 Ajouter SAST — configurer CodeQL ou Semgrep dans un workflow dédié, couvrant Go + TypeScript 🟡 M Nouveau .github/workflows/sast.yml SAST s'exécute sur chaque PR, résultats visibles dans les checks
017 Compléter staging compose — ajouter chat-server, stream-server, et reverse proxy (Caddy/Nginx) au compose staging 🟡 M docker-compose.staging.yml (créer ou compléter) docker compose -f docker-compose.staging.yml up démarre tous les services
018 Ajouter alerting Prometheus — configurer des alertes pour : service down > 30s, error rate > 5%, latence P99 > 2s, Redis unreachable 🟡 M config/prometheus/, nouveau config/alertmanager/ Alertes se déclenchent quand les seuils sont dépassés
019 Health checks Docker — ajouter healthcheck pour chaque service dans les composes prod et staging 🟡 S docker-compose.prod.yml, docker-compose.staging.yml docker compose ps montre le statut santé de chaque service
020 Implémenter hash des reset tokens — hasher les password reset tokens en base (SHA-256), comparer le hash lors de la validation 🟡 S Handler password reset, migration (ajouter colonne token_hash si nécessaire) Un dump DB ne permet pas d'utiliser les reset tokens

Livrable Sprint 2 : Tag v0.404-alpha2. CI/CD fiable, monitoring avec alertes, infra sécurisée.


Sprint 3 — Nettoyage & Qualité code (jours 1320)

Objectif : Réduire la dette technique critique, éliminer le code mort, aligner doc et réalité.

# Ticket Gravité Effort Fichiers impactés Critère de complétion
021 Supprimer code mort (~13K LOC) — internal/api/archive/api_manager.go (789 LOC), dev-environment/templates/ non utilisés, fixtures/ vide, packages/ vide, veza-docs/ non alimenté 🟡 M Voir liste. Vérifier avec grep -r qu'aucun import ne référence ces fichiers. LOC total réduit de ~13K. Aucune régression.
022 Supprimer/corriger mocks commerceService — les données factices (getSellerStats, etc.) doivent soit pointer vers les API réelles (v0.401+ les a créées), soit être clairement marquées comme non-prod 🟡 S apps/web/src/services/commerceService.ts (localiser les mocks) Aucun mock ne retourne de données factices en mode production
023 Remplacer fmt.Printf par logger structuré — 15+ occurrences identifiées dans le backend. Utiliser zap déjà configuré. 🟡 S grep -rn "fmt.Print" veza-backend-api/internal/ pour la liste exacte Aucun fmt.Printf dans internal/ (hors tests)
024 Éliminer les any TypeScript — 90+ occurrences. Remplacer par des types concrets ou unknown avec type guards. Prioriser les fichiers services/ et stores/. 🟡 L apps/web/src/services/, apps/web/src/stores/ `grep -rn ": any" apps/web/src/
025 Aligner FEATURE_STATUS.md avec la réalité — pour chaque feature "opérationnelle", vérifier le flux E2E. Dégrader en "partielle" les features qui dépendent de MSW ou de services Rust OFF. 🟡 M docs/FEATURE_STATUS.md Le document reflète fidèlement l'état du code
026 Aligner TypeScript versions — 5.3.3 dans apps/web/package.json vs 5.9.3 dans root. Unifier sur la dernière stable. 🟡 S package.json (root + apps/web) grep -r "typescript" */package.json retourne la même version
027 Nettoyer gRPC protobuf dupliqué — les fichiers proto générés sont dupliqués entre chat et stream. Centraliser dans un dossier proto/ partagé ou un build step commun. 🟡 M veza-chat-server/proto/, veza-stream-server/proto/ Un seul jeu de fichiers proto, importé par les deux services
028 Documenter la décision Rust — écrire un ADR (Architecture Decision Record) expliquant pourquoi Go + Rust, quand utiliser quoi, et le plan pour le chat server (garder Rust ou migrer Go) 🟡 S Nouveau docs/adr/ADR-001-rust-services.md ADR rédigé et référencé dans docs/README.md

Livrable Sprint 3 : Tag v0.404-beta. Codebase nettoyé, documentation alignée.


Sprint 4 — Intégration services & Tests (jours 2130)

Objectif : Décider du sort des services Rust. Ajouter les tests d'intégration manquants.

# Ticket Gravité Effort Fichiers impactés Critère de complétion
029 Décision : chat server Rust — intégrer ou remplacer — Évaluer le coût d'intégration (gRPC fonctionnel, auth, persistence) vs le coût de réécriture en Go. Produire un document de décision. Si intégration : continuer ticket 030. Si remplacement : planifier en v0.501. 🟠 S (décision) ADR-002 rédigé avec décision argumentée
030 Intégrer le stream server Rust — connecter gRPC entre backend Go et stream server, activer HLS (HLS_STREAMING=true), vérifier le flux upload → transcode → HLS serve → player 🟠 XL veza-stream-server/, veza-backend-api/internal/services/stream/, docker-compose.prod.yml, apps/web/src/services/hlsService.ts Un track uploadé est jouable en HLS via le stream server
031 Tests d'intégration cross-service — écrire des tests qui vérifient les flux critiques avec tous les services démarrés (Docker Compose test). Minimum : auth → upload → playback, register → login → chat. 🟡 L Nouveau dossier tests/integration/ ou dans scripts/ 5+ scénarios E2E qui passent en CI
032 Fixer tests désactivés backendmetrics_test.go, profile_handler_test.go, system_metrics_test.go désactivés pour bitrot. Les corriger ou les supprimer. 🟡 M Fichiers de test identifiés dans le CHANGELOG (section Known Issues) Aucun test skip ou disabled restant
033 Ajouter tests Rust — les services Rust ont peu/pas de tests. Ajouter au minimum : tests unitaires JWT validation, tests WebSocket message routing, tests de non-régression. 🟡 L veza-chat-server/tests/, veza-stream-server/tests/ cargo test passe avec > 20 tests par service
034 Remplacer gorilla/websocket — librairie archivée (déc. 2024), plus de patches sécurité. Migrer vers nhooyr.io/websocket ou coder/websocket. 🟡 M veza-backend-api/ — tous les fichiers importants gorilla/websocket Aucune dépendance à gorilla/websocket

Livrable Sprint 4 : Tag v0.404-rc1. Services intégrés ou décision documentée. Tests d'intégration en place.


Sprint 5 — Finalisation v0.404 (jours 3135)

Objectif : Valider la stabilisation, tagger, préparer v0.501.

# Ticket Gravité Effort Fichiers impactés Critère de complétion
035 Smoke test prod — déployer sur l'environnement staging la config prod complète. Vérifier les 14 features E2E identifiées dans l'audit. Documenter les résultats. 🟠 M Staging environment 14/14 features E2E fonctionnent en staging
036 Mettre à jour PROJECT_STATE.md pour v0.404 🟡 S docs/PROJECT_STATE.md Reflète l'état post-stabilisation
037 Mettre à jour SCOPE_CONTROL.md — référence active → v0.501 🟡 S docs/SCOPE_CONTROL.md Référence pointe vers V0_501_RELEASE_SCOPE.md
038 Archiver V0_404_RELEASE_SCOPE.md dans docs/archive/ 🟡 S docs/archive/ Document archivé
039 Tag v0.404 S Git Tag créé, CHANGELOG mis à jour
040 Rétrospective audit — comparer les scores pré/post stabilisation. Documenter ce qui reste à traiter en v0.501+. 🟡 S Nouveau docs/RETRO_V0_404.md Document rédigé

Livrable Sprint 5 : Tag v0.404. Stabilisation terminée. Prêt pour Phase 5.


Résumé

Sprint Jours Tickets Focus
1 15 001010 Sécurité critique
2 612 011020 Infra & CI/CD
3 1320 021028 Nettoyage & Qualité
4 2130 029034 Intégration & Tests
5 3135 035040 Finalisation & Tag

Durée totale : ~7 semaines (35 jours ouvrés) Tickets : 40 Répartition effort : 14 S, 14 M, 5 L, 2 XL, 5 tâches administratives


Tickets reportés à v0.501+

Ces éléments de l'audit ne sont pas bloquants pour la stabilisation mais doivent être traités :

Ticket Description Version cible
Découper fichiers > 1000 LOC track/handler.go, interceptors.ts, config.go v0.501
Consolider migrations Squash 78 migrations en baseline v0.501
Migration React 19 React 18.2.0 → 19. Évaluer impact hooks. v0.602
Réécriture chat server Go Si décision ADR-002 = remplacement v0.501v0.502
Blue-green deployment Nécessite reverse proxy + health checks v0.601
Container image scanning Trivy ou Grype en CI v0.501
IaC (Terraform/Pulumi) Infrastructure as Code v0.801
Hyperswitch mode production Passer de test à live v0.501 (si payout ready)