docs(tech-debt): réorg sécurité v1.15 — FTD-06/08/15 gelées, FTD-27/28/29 ajoutées

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Hermann_Kitio 2026-04-23 02:21:27 +03:00
parent 2a6ea10978
commit 04dfbe2731

View file

@ -1,6 +1,6 @@
# TECH_DEBT.md — Expria Frontend
> **Document de référence — Version 1.14**
> **Document de référence — Version 1.15**
> Ce document recense les décisions techniques prises par pragmatisme qui devront être revisitées, les stubs temporaires, et les fonctionnalités reportées.
> À mettre à jour après chaque session de développement.
>
@ -114,22 +114,6 @@ Vient du pattern `c.json(result, result.status)` où `result` contient déjà `s
---
### FTD-15 — Option `'system'` manquante dans ThemeProvider
**Priorité :** 🟢 Mineur
**Statut :** Reporté — après MVP
**Estimation de session :** 2h
**Description :** Le `ThemeProvider` est bi-state (`'light' | 'dark'`). L'option `'system'` (qui suit `prefers-color-scheme` en temps réel via `MediaQueryList.addEventListener`) a été volontairement différée (décision Sprint 0.5).
**À faire :**
- Étendre le type `Theme` à `'light' | 'dark' | 'system'`
- Dans `ThemeProvider`, si `theme === 'system'` : écouter `matchMedia('(prefers-color-scheme: dark)')` et appliquer/retirer `.dark` dynamiquement
- `ThemeToggle` : cycle light → dark → system (ou un sélecteur 3 états)
- Mettre à jour `getInitialTheme()` pour retourner `'system'` si aucune préférence stockée
**Condition de résolution :** après MVP — confort utilisateur, pas bloquant.
---
> FTD-17, FTD-18, FTD-19 résolus au Sprint 3.5 (2026-04-22) — voir §5 Historique des résolutions.
---
@ -208,22 +192,47 @@ Risque : confusion pour un futur dev sur quel composant utiliser.
---
## 3. Fonctionnalités reportées
### FTD-27 — CI GitHub Actions pour `expria-backend`
**Priorité :** 🔴 Critique
**Statut :** Ouvert
**Estimation de session :** 2h
**Description :** Le backend n'a aucune CI. Aucun typecheck, test, ni audit ne s'exécute automatiquement. Le backend gère Stripe, JWT, permissions — c'est le dépôt le plus sensible.
### FTD-06 — AudioWorklet au lieu de ScriptProcessorNode (T2 Live)
**Priorité :** 🟢 Mineur
**Statut :** Reporté à après le lancement MVP
**Estimation de session :** 1 jour
**Description :** Hérité du backend (TD-09). Côté frontend, le traitement audio pour la T2 Live (capture PCM 16kHz) devra probablement utiliser `AudioWorklet` au lieu de `ScriptProcessorNode` qui est déprécié.
**À faire :** créer `.github/workflows/ci.yml` dans `expria-backend` avec jobs :
- `typecheck` (`tsc --noEmit`)
- `test` (`vitest run`)
- `audit` (`npm audit --audit-level=high`)
**Impact actuel :** fonctionne avec warnings dans la console. Peut poser problème sur certains navigateurs futurs.
**À faire :** session dédiée après le lancement MVP, pour migrer le pipeline audio vers AudioWorklet.
**Condition de résolution :** après 30 jours de production stable.
**Condition de résolution :** CI verte sur le prochain push backend.
---
### FTD-28 — Semgrep dans CI frontend + backend
**Priorité :** 🔴 Critique
**Statut :** Ouvert
**Estimation de session :** 1h
**Description :** `SECURITY.md` §4.3 exige `semgrep scan` en CI. Absent des deux dépôts. SEC-05 (XSS rapports IA) classé critique nécessite un scan SAST.
**À faire :** ajouter un step `semgrep scan --config=auto` dans les CI des deux dépôts. Bloquer sur sévérité ERROR uniquement.
**Condition de résolution :** Semgrep exécuté et vert sur les deux CI.
---
### FTD-29 — `.github/dependabot.yml` dans les 2 dépôts
**Priorité :** 🟡 Important
**Statut :** Ouvert
**Estimation de session :** 30 min
**Description :** Dependabot alerts et security updates sont activés via l'UI GitHub mais sans fichier de config, les version updates automatiques ne fonctionnent pas.
**À faire :** créer `.github/dependabot.yml` dans les 2 dépôts (ecosystem `npm`, schedule `weekly`, directory `/`).
**Condition de résolution :** fichier mergé dans les 2 dépôts.
---
## 3. Fonctionnalités reportées
### FTD-07 — Sentry non intégré
**Priorité :** 🟡 Important
**Statut :** Planifié — après MVP
@ -242,18 +251,6 @@ Risque : confusion pour un futur dev sur quel composant utiliser.
---
### FTD-08 — Tests E2E non implémentés
**Priorité :** 🟢 Mineur
**Statut :** Reporté — accepté par design
**Estimation de session :** 2 jours (Playwright setup)
**Description :** Actuellement, les tests de bout en bout sont manuels (via `GOLDEN_DATASET.md`). Une automatisation avec Playwright permettrait de détecter les régressions UI sans effort humain.
**À faire :** session Playwright setup après MVP, pour automatiser au minimum les 10 scénarios du Groupe Z (smoke test).
**Condition de résolution :** quand la maintenance manuelle du Golden Dataset devient trop chronophage.
---
### FTD-21 — Persistance session simulation
**Priorité :** 🔴 Critique
**Statut :** Partiellement résolu — `/simulation/ee` ✅ (2026-04-21)
@ -300,6 +297,52 @@ Frontend :
---
## 3bis. Backlog gelé — post-MVP
> Ces FTDs sont volontairement gelées : elles concernent des fonctionnalités non encore livrées (T2 Live, tests E2E) ou du confort utilisateur non bloquant (option `'system'` thème). Elles **ne comptent pas dans le cap de 15 FTD actives** et seront réactivées quand leur sprint arrive ou quand la condition de déblocage (post-MVP) est atteinte.
### FTD-06 — AudioWorklet au lieu de ScriptProcessorNode (T2 Live)
**Priorité :** 🟢 Mineur
**Statut :** Gelé — post-MVP (T2 Live non encore implémenté)
**Estimation de session :** 1 jour
**Description :** Hérité du backend (TD-09). Côté frontend, le traitement audio pour la T2 Live (capture PCM 16kHz) devra probablement utiliser `AudioWorklet` au lieu de `ScriptProcessorNode` qui est déprécié.
**Impact actuel :** fonctionne avec warnings dans la console. Peut poser problème sur certains navigateurs futurs.
**À faire :** session dédiée après le lancement MVP, pour migrer le pipeline audio vers AudioWorklet.
**Condition de résolution :** après 30 jours de production stable.
---
### FTD-08 — Tests E2E non implémentés
**Priorité :** 🟢 Mineur
**Statut :** Gelé — post-MVP (accepté par design)
**Estimation de session :** 2 jours (Playwright setup)
**Description :** Actuellement, les tests de bout en bout sont manuels (via `GOLDEN_DATASET.md`). Une automatisation avec Playwright permettrait de détecter les régressions UI sans effort humain.
**À faire :** session Playwright setup après MVP, pour automatiser au minimum les 10 scénarios du Groupe Z (smoke test).
**Condition de résolution :** quand la maintenance manuelle du Golden Dataset devient trop chronophage.
---
### FTD-15 — Option `'system'` manquante dans ThemeProvider
**Priorité :** 🟢 Mineur
**Statut :** Gelé — post-MVP
**Estimation de session :** 2h
**Description :** Le `ThemeProvider` est bi-state (`'light' | 'dark'`). L'option `'system'` (qui suit `prefers-color-scheme` en temps réel via `MediaQueryList.addEventListener`) a été volontairement différée (décision Sprint 0.5).
**À faire :**
- Étendre le type `Theme` à `'light' | 'dark' | 'system'`
- Dans `ThemeProvider`, si `theme === 'system'` : écouter `matchMedia('(prefers-color-scheme: dark)')` et appliquer/retirer `.dark` dynamiquement
- `ThemeToggle` : cycle light → dark → system (ou un sélecteur 3 états)
- Mettre à jour `getInitialTheme()` pour retourner `'system'` si aucune préférence stockée
**Condition de résolution :** après MVP — confort utilisateur, pas bloquant.
---
## 4. Tests à renforcer
### FTD-09 — Tests de la state machine T2 Live non implémentés
@ -380,3 +423,4 @@ Frontend :
| 1.12 | 2026-04-22 | Sprint 3.6a — Ajout FTD-23 🟡 (useAutosave fire après correction). 16 FTD actives → cap de 15 dépassé temporairement, à revoir au prochain clean. |
| 1.13 | 2026-04-22 | Sprint 3.6b — Ajout FTD-24 🟡 (polling auto exercices/modèle pending). 17 FTD actives → cap dépassé, un clean 3.6.5 devra résoudre FTD-23/24 ensemble. |
| 1.14 | 2026-04-23 | Triage : FTD-04, FTD-05, FTD-20, FTD-22 fermées. FTD-25, FTD-26 ajoutées. 15 FTD actives (cap respecté). |
| 1.15 | 2026-04-23 | Réorg sécurité : FTD-06, FTD-08, FTD-15 gelées (backlog post-MVP). FTD-27 🔴, FTD-28 🔴, FTD-29 🟡 ajoutées (sécurité). 15 FTD actives (cap respecté). |