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

147 lines
15 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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/ | wc -l` < 10 |
| 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 backend** `metrics_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) |