feat(rapport/eo): support 5 critères × /4 — Phonologie (Sprint 4.8 frontend)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
3ce91aaa7b
commit
04019f8348
11 changed files with 273 additions and 10 deletions
|
|
@ -29,7 +29,27 @@ Chaque entrée suit ce format :
|
|||
|
||||
---
|
||||
|
||||
## [Unreleased] — 2026-04-25 — Sprint 4.6 — UI EO (waveform + timeline)
|
||||
## [Unreleased] — 2026-04-26 — Sprint 4.8 — Phonologie EO (frontend)
|
||||
|
||||
### Added
|
||||
|
||||
- `src/entities/report/__tests__/getMaxScorePerCritere.test.ts` — 7 tests (détection maxScore + mapping libellés EO).
|
||||
|
||||
### Changed
|
||||
|
||||
- `src/entities/report/lib.ts` — nouveau helper `getMaxScorePerCritere(rapport): 4 | 5` (détection sur criteres.length === 5). `CRITERE_NOM_TO_CODE` étendu avec les 4 libellés EO Sprint 4.8.
|
||||
- `src/features/simulations/components/rapport/CritereCard.tsx` — nouvelle prop `maxScore` : affiche `X/4` (EO Sprint 4.8) ou `X/5` (EE, EO legacy).
|
||||
- `src/features/simulations/pages/RapportPage.tsx` — calcul maxScore propagé aux CritereCard.
|
||||
- `src/entities/report/types.ts` — commentaire Critere.score clarifié.
|
||||
|
||||
### Notes
|
||||
|
||||
- Rétrocompatibilité : rapports EO legacy (4 critères × /5) et EE (4 × /5) inchangés.
|
||||
- Tests : 191 → 198 verts (+7).
|
||||
|
||||
---
|
||||
|
||||
## [Unreleased] — 2026-04-26 — Sprint 4.6 — UI EO (waveform + timeline)
|
||||
|
||||
### Added
|
||||
|
||||
|
|
|
|||
148
docs/DEPLOYMENT.md
Normal file
148
docs/DEPLOYMENT.md
Normal file
|
|
@ -0,0 +1,148 @@
|
|||
# DEPLOYMENT.md — Expria V2
|
||||
> Version 1.0 — Rédigé avant lancement
|
||||
> Procédure officielle de bascule V1 → V2 sur expria.app
|
||||
> À lire intégralement avant toute action de déploiement.
|
||||
|
||||
---
|
||||
|
||||
## 1. Architecture cible
|
||||
|
||||
| Composant | V1 (actuel) | V2 (cible) |
|
||||
|---|---|---|
|
||||
| Frontend | Next.js sur Render | React/Vite sur Cloudflare Pages |
|
||||
| Backend | Next.js API routes sur Render | Hono.js sur Render (déjà live) |
|
||||
| DNS | Vercel | Vercel (inchangé) |
|
||||
| Domaine | expria.app | expria.app (inchangé) |
|
||||
| Auth | Supabase | Supabase (inchangé) |
|
||||
| Paiement | Stripe | Stripe (inchangé) |
|
||||
|
||||
---
|
||||
|
||||
## 2. Prérequis — ne pas lancer la bascule sans cocher tout
|
||||
|
||||
### Code
|
||||
- [ ] Tous les tests Vitest backend passent (0 échec)
|
||||
- [ ] Tous les tests Vitest frontend passent (0 échec)
|
||||
- [ ] npm run typecheck frontend → 0 erreur
|
||||
- [ ] Smoke test complet (Groupe Z du GOLDEN_DATASET.md) validé en local
|
||||
|
||||
### Infrastructure
|
||||
- [ ] Backend V2 stable sur api.expria.app depuis au moins 48h sans erreur critique Sentry
|
||||
- [ ] Sentry configuré et actif sur le frontend V2
|
||||
- [ ] Variables d'environnement Cloudflare Pages configurées :
|
||||
- VITE_API_URL=https://api.expria.app
|
||||
- VITE_SUPABASE_URL=...
|
||||
- VITE_SUPABASE_ANON_KEY=...
|
||||
- VITE_ENABLE_T2_LIVE=false
|
||||
- [ ] CNAME Cloudflare Pages créé et testé sur une URL de preview
|
||||
|
||||
### Stripe
|
||||
- [ ] Webhooks Stripe pointent vers api.expria.app (backend V2)
|
||||
- [ ] Test de paiement réel effectué sur l'URL de preview Cloudflare Pages
|
||||
|
||||
### Rollback DNS — valeurs de référence (ne pas supprimer)
|
||||
- @ → A → 216.24.57.1 (frontend V1 Render)
|
||||
- www → CNAME → expria.onrender.com (frontend V1 Render)
|
||||
- api → CNAME → expria-backend.onrender.com (backend V2 — inchangé)
|
||||
|
||||
---
|
||||
|
||||
## 3. Procédure de bascule — dans l'ordre exact
|
||||
|
||||
### Étape 1 — Mettre V1 en mode maintenance (2 min)
|
||||
Dans Render, sur le service frontend V1 :
|
||||
- Modifier la variable d'environnement `MAINTENANCE_MODE=true`
|
||||
- Redéployer le service V1
|
||||
- Vérifier que expria.app affiche la page de maintenance
|
||||
|
||||
> ⚠️ À partir de ce moment, expria.app est inaccessible pour les utilisateurs.
|
||||
> Faire cette étape à une heure creuse (nuit, week-end).
|
||||
|
||||
### Étape 2 — Configurer le CNAME dans Vercel (5 min)
|
||||
Dans le dashboard Vercel → Domains → expria.app :
|
||||
- Supprimer ou modifier l'enregistrement A/CNAME actuel qui pointe vers Render
|
||||
- Ajouter un CNAME : `expria.app` → `<projet>.pages.dev` (URL Cloudflare Pages)
|
||||
- Sauvegarder
|
||||
|
||||
### Étape 3 — Configurer le domaine dans Cloudflare Pages (5 min)
|
||||
Dans Cloudflare Pages → projet expria-frontend → Custom domains :
|
||||
- Ajouter `expria.app`
|
||||
- Cloudflare Pages vérifie le CNAME automatiquement
|
||||
- Attendre la validation (peut prendre 1-5 min)
|
||||
|
||||
### Étape 4 — Vérifier la propagation DNS (5-15 min)
|
||||
Vérifier sur https://dnschecker.org que `expria.app` pointe vers Cloudflare Pages.
|
||||
Ne pas continuer avant que la propagation soit visible depuis au moins 3 régions.
|
||||
|
||||
### Étape 5 — Smoke test en production (15 min)
|
||||
Rejouer le Groupe Z du GOLDEN_DATASET.md sur expria.app :
|
||||
- [ ] Z1 — Inscription + première simulation Free
|
||||
- [ ] Z2 — Blocage quota Free
|
||||
- [ ] Z3 — Simulation Standard complète
|
||||
- [ ] Z4 — Mode examen bloqué en Standard
|
||||
- [ ] Z5 — T2 live Premium
|
||||
- [ ] Z6 — Mode examen EE complet
|
||||
- [ ] Z7 — Paiement Free → Standard
|
||||
- [ ] Z8 — Prorata Standard → Premium
|
||||
- [ ] Z9 — Déconnexion + accès protégé
|
||||
- [ ] Z10 — Responsive mobile Home + Login
|
||||
|
||||
### Étape 6 — Vérifier Sentry (5 min)
|
||||
- Ouvrir le dashboard Sentry projet expria-frontend
|
||||
- Vérifier qu'aucune erreur critique n'apparaît dans les 5 premières minutes
|
||||
- Si erreur critique → déclencher le rollback immédiatement
|
||||
|
||||
### Étape 7 — Déclarer la bascule réussie
|
||||
- Noter la date et l'heure dans ce fichier (section 6)
|
||||
- Désactiver MAINTENANCE_MODE sur V1 (optionnel — V1 reste sur Render comme fallback 30 jours)
|
||||
|
||||
---
|
||||
|
||||
## 4. Rollback — si quelque chose casse
|
||||
|
||||
**Objectif : revenir sur V1 en moins de 10 minutes.**
|
||||
|
||||
### Étape 1 — Désactiver V2 (2 min)
|
||||
Dans Cloudflare Pages → projet expria-frontend :
|
||||
- Désactiver le domaine personnalisé expria.app
|
||||
|
||||
### Étape 2 — Remettre V1 en ligne (3 min)
|
||||
Dans Vercel → Domains → expria.app :
|
||||
- Remettre le CNAME/A record vers Render (valeur originale)
|
||||
Dans Render → service frontend V1 :
|
||||
- Modifier `MAINTENANCE_MODE=false`
|
||||
- Redéployer
|
||||
|
||||
### Étape 3 — Vérifier (5 min)
|
||||
- Vérifier que expria.app affiche à nouveau V1
|
||||
- Vérifier que la connexion et une simulation fonctionnent
|
||||
|
||||
### Étape 4 — Diagnostiquer
|
||||
- Ouvrir Sentry V2 — identifier l'erreur critique
|
||||
- Ne pas retenter la bascule avant d'avoir corrigé et rejoué le Groupe Z complet
|
||||
|
||||
---
|
||||
|
||||
## 5. Post-bascule — checks 24h après
|
||||
|
||||
- [ ] Sentry : aucune erreur critique nouvelle
|
||||
- [ ] Stripe : webhooks reçus et traités correctement
|
||||
- [ ] Supabase : aucune erreur d'auth dans les logs
|
||||
- [ ] Au moins 1 simulation complète effectuée par un vrai utilisateur
|
||||
- [ ] V1 sur Render toujours en ligne comme fallback (désactiver après 30 jours)
|
||||
|
||||
---
|
||||
|
||||
## 6. Historique des déploiements
|
||||
|
||||
| Date | Version | Résultat | Notes |
|
||||
|---|---|---|---|
|
||||
| — | — | — | — |
|
||||
|
||||
---
|
||||
|
||||
## 7. Historique du document
|
||||
|
||||
| Version | Date | Changements |
|
||||
|---|---|---|
|
||||
| 1.0 | 2026-04-19 | Création initiale |
|
||||
Loading…
Add table
Add a link
Reference in a new issue