docs(tech-debt): triage FTD v1.14 — 17→15 actives

Fermées : FTD-04 (miroir docs, accepté ADR 004), FTD-05 (scaffold
caduc, audit clean), FTD-20 (GET /simulations/:id livré Sprint 3.6a),
FTD-22 (code orphelin /sujets, résolution complète).

Ajoutées : FTD-25 (ARCHITECTURE.md §3 désaligné), FTD-26
(cohabitation shared/ui vs shared/components/ui).

Cap de 15 FTD actives respecté.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Hermann_Kitio 2026-04-23 01:42:11 +03:00
parent a60c298605
commit a0352457dc

View file

@ -1,6 +1,6 @@
# TECH_DEBT.md — Expria Frontend
> **Document de référence — Version 1.2**
> **Document de référence — Version 1.14**
> 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.
>
@ -72,57 +72,8 @@ Vient du pattern `c.json(result, result.status)` où `result` contient déjà `s
---
### FTD-20 — `GET /simulations/:id` manquant dans le backend
**Priorité :** 🔴 Critique (bloque RapportPage — Sprint 3 étape 15)
**Statut :** Ouvert — session backend requise
**Estimation de session :** 2h (backend)
**Description :** Le backend n'expose pas de route de lecture pour récupérer une simulation et son rapport après correction. `POST /corrections/ee` retourne le rapport dans sa réponse mais celui-ci n'est pas persisté côté frontend entre les navigations. `RapportPage` appelle `GET /simulations/:id` via `getReport()` + `useRapport()` — la route retourne 404 côté backend.
**Contexte frontend :** `src/entities/report/api.ts``getReport(id)`, `src/features/simulations/hooks/useRapport.ts`, `src/features/simulations/pages/RapportPage.tsx` sont implémentés et typechecked. Ils fonctionneront dès que le backend expose la route.
**À faire (session backend) :**
- Ajouter `GET /simulations/:id` dans `expria-backend/src/routes/simulations.ts`
- Retourner : `id`, `tache`, `mode`, `score`, `nclc`, `feedback_court`, `criteres`, `erreurs`, `modele`, `idees`, `exercices`
- Appliquer `authMiddleware` + vérifier que la simulation appartient à l'utilisateur connecté
- Retourner `SIMULATION_NOT_FOUND` (404) si la simulation n'existe pas ou appartient à un autre utilisateur
**Condition de résolution :** après implémentation backend + test manuel RapportPage complet (Free, Standard, Premium).
---
## 2. Dettes frontend propres
### FTD-04 — Documents miroir sans automatisation de synchronisation
**Priorité :** 🟢 Mineur
**Statut :** Ouvert — accepté par design (voir ADR 004)
**Estimation de session :** 1 jour (mise en place monorepo)
**Description :** Les documents `PLANS_TARIFAIRES.md`, `PARCOURS_UTILISATEURS.md`, et le fichier de code `src/entities/user/access.ts` existent à l'identique dans les deux dépôts (frontend et backend). La synchronisation est manuelle — si un changement est fait dans un dépôt sans être répercuté dans l'autre, divergence silencieuse.
**Mitigation actuelle :**
- Règle G de `DEVELOPMENT_PRINCIPLES.md` (modifications simultanées dans le même commit logique)
- Commentaire `// SOURCE OF TRUTH:` en tête de `access.ts`
- Tests de parité dans `src/entities/user/__tests__/access.test.ts` (calqués sur les tests backend)
**À faire si la dette devient trop coûteuse :**
- Migrer vers un monorepo pnpm workspaces avec package partagé `@expria/types-and-access`
- OU ajouter un script CI qui vérifie que le hash SHA-256 de `access.ts` matche entre les deux dépôts
**Condition de résolution :** après 3+ mois de production stable, ou si une divergence silencieuse cause un bug.
---
### FTD-05 — Ancien scaffold frontend possiblement caduc
**Priorité :** 🟡 Important
**Statut :** Ouvert — diagnostic en cours (session Claude Code)
**Estimation de session :** variable selon diagnostic
**Description :** Un scaffold frontend a été créé au démarrage du projet (fin mars 2026 ou début avril 2026), avant que les décisions architecturales récentes (entities/features/shared, auth-client/api-client découplés, pas de Zustand, etc.) ne soient prises. Le contenu actuel de `D:\expria-frontend\` peut donc contenir des fichiers qui ne matchent plus l'architecture cible.
**À faire :** session Claude Code (première session frontend de la V2) qui fait un état des lieux complet et propose une stratégie (clean slate / refactor progressif / adaptation en place). Cf. prompt de session dans l'historique de conversation Claude AI du 2026-04-17.
**Condition de résolution :** fin du Sprint 0 (scaffold conforme à `ARCHITECTURE.md`).
---
### FTD-10 — Semgrep non intégré en CI
**Priorité :** 🟢 Mineur
**Statut :** Reporté — après MVP
@ -227,6 +178,36 @@ Vient du pattern `c.json(result, result.status)` où `result` contient déjà `s
---
### FTD-25 — Mise à jour ARCHITECTURE.md §3 (arborescence réelle)
**Priorité :** 🟢 Mineur
**Statut :** Ouvert
**Estimation de session :** 1h
**Description :** ARCHITECTURE.md §3 ne liste pas `entities/patterns`, `features/historique`, `features/progression`, `features/design-system` (ajoutés aux Sprints 3.6c et 3.7). Les composants layout (`AppLayout`, `Sidebar`, `MobileHeader`, `BottomNav`, `MaintenancePage`) sont dans `app/` alors que §3 ne prévoit que `providers`, `router`, `main` dans ce dossier.
**À faire :**
- Mettre à jour ARCHITECTURE.md §3 pour refléter l'arborescence réelle.
- Formaliser `app/` comme contenant entry points + composants layout de la coquille OU déplacer vers `shared/components/layout/`.
**Condition de résolution :** ARCHITECTURE.md §3 reflète l'arborescence réelle.
---
### FTD-26 — Clarifier cohabitation `shared/ui/` vs `shared/components/ui/`
**Priorité :** 🟡 Important
**Statut :** Ouvert
**Estimation de session :** 2h
**Description :** Deux conventions UI cohabitent sans documentation :
- `src/shared/ui/{Button,Card,Badge}.tsx` (PascalCase) — wrappers Expria, 40+ imports dans les features.
- `src/shared/components/ui/{button,dialog,input,…}.tsx` (kebab-case) — primitives shadcn/ui, 7 fichiers consommateurs.
Risque : confusion pour un futur dev sur quel composant utiliser.
**À faire :** documenter la convention dans ARCHITECTURE.md (distinction wrappers Expria / primitives shadcn) **OU** regrouper sous un seul dossier (ex. `shared/components/ui/primitives/` + `shared/components/ui/expria/`).
**Condition de résolution :** un seul pattern documenté et appliqué.
---
## 3. Fonctionnalités reportées
### FTD-06 — AudioWorklet au lieu de ScriptProcessorNode (T2 Live)
@ -370,7 +351,10 @@ Frontend :
| FTD-11 | `@theme` Tailwind 4 non défini — palette et typographie absentes | 2026-04-18 | Résolu au Sprint 0.5 (design system). Palette Direction H complète (canvas/surface/ink/expria/deep/semantic) + typo Plus Jakarta Sans définis dans `src/index.css` via `@theme {}` et `.dark {}`. shadcn/ui remappé sur ces tokens. Règle L ajoutée dans `DEVELOPMENT_PRINCIPLES.md` pour garantir l'usage exclusif des tokens. |
| FTD-13 | Incompatibilité Vitest 3 / Vite 8 (conflit de types `Plugin<any>` entre le Vite 8 top-level avec Rolldown et le Vite 7 pinné de Vitest 3.2.4 ; `npm run build` cassé) | 2026-04-17 | Résolu par upgrade Vitest `3.2.4 → 4.1.4` (et `@vitest/coverage-v8` idem) à l'étape 12-bis du Sprint 0. Vitest 4.x supporte nativement Vite 8 Rolldown. Correctif complémentaire : script `typecheck` passé de `tsc --noEmit -p tsconfig.app.json` à `tsc -b --noEmit` pour couvrir aussi `tsconfig.node.json` (d'où `vite.config.ts`) et éviter qu'un bug similaire échappe à la CI. |
| FTD-16 | `VITE_MAINTENANCE_MODE` non lu dans le code — la variable d'env était dans `env.ts` mais jamais consommée | 2026-04-18 | Résolu au Sprint 1 étape 6. Ajout de `isMaintenanceMode` dans `src/shared/config/env.ts` et garde dans `src/app/main.tsx` : `isMaintenanceMode ? <MaintenancePage /> : <Providers />`. `MaintenancePage` est statique (aucun provider requis), tokens Direction H exclusivement. |
| FTD-22 | Code orphelin suite à la refonte UX `/sujets` (2026-04-21) — composant `SujetSelector` et helper `selectSujet` plus référencés après bascule dropdown → page dédiée | 2026-04-21 | Résolu **partiellement**. Supprimé : `src/features/simulations/components/SujetSelector.tsx` + helper `selectSujet` de `useSimulation.ts` (les tests `useSimulation.test.tsx` adaptés en utilisant `changeSubject` + `setStep('task-selected')` via `useSimulationFlow`). **Conservés intentionnellement** : le step `'choosing-subject'` (utilisé par `SimulationFlowProvider.selectTask` pour les tâches avec catalogue et par `SimulationPage` pour naviguer vers `/sujets`) et le helper `goToSubjectPicker` (bouton "Changer de sujet" dans `SimulationForm`). |
| FTD-22 | Code orphelin suite à la refonte UX `/sujets` (2026-04-21) — composant `SujetSelector` et helper `selectSujet` plus référencés après bascule dropdown → page dédiée | 2026-04-23 | Résolution complète. `SujetSelector` + `selectSujet` supprimés. Éléments conservés (`choosing-subject`, `goToSubjectPicker`) sont activement utilisés par `SimulationFlowProvider` et `SimulationForm` — ce n'est plus de la dette. |
| FTD-20 | `GET /simulations/:id` manquant dans le backend | 2026-04-22 | Implémenté au Sprint 3.6a (backend) — route complète avec auth, owner check, `REPORT_NOT_READY`. Consommé par `RapportPage` et `useAutosave`. |
| FTD-04 | Documents miroir sans automatisation de synchronisation | 2026-04-23 | Risque accepté par design (ADR 004). Mitigation en place (Règle G, commentaire `SOURCE OF TRUTH`, tests de parité). Condition de ré-ouverture : si une divergence silencieuse cause 2+ bugs en production. |
| FTD-05 | Ancien scaffold frontend possiblement caduc | 2026-04-23 | Audit Claude Code complet — aucun résidu scaffold Vite, aucun fichier orphelin, règles critiques (D, E, F, G, J + ADR 003/005) respectées. Désalignements documentaires traités via FTD-25 et FTD-26. |
| FTD-17 | Clé `['plan']` dupliquée entre features (`usePlan`, `SimulationPage`, `RapportPage`) | 2026-04-22 | Résolu au Sprint 3.5. Création de `src/entities/user/query-keys.ts` (constantes pures, aucun import runtime) exportant `PLAN_QUERY_KEY = ['plan'] as const`. `features/dashboard/hooks/usePlan.ts` l'importe et le re-exporte pour conserver la rétro-compatibilité de l'import `PLAN_QUERY_KEY`. `SimulationPage.tsx` et `RapportPage.tsx` remplacent leur `useQuery` inline par le hook `usePlan()` — dédup totale de la clé et de la config staleTime. |
| FTD-18 | SimulationForm utilise encore le shadcn Button au lieu de la primitive `@/shared/ui/Button` | 2026-04-22 | Résolu au Sprint 3.5. Remplacement de l'import `@/shared/components/ui/button` par `@/shared/ui/Button` dans `SimulationForm.tsx`. Aucun variant à adapter (usage du Button sans prop `variant``primary` par défaut dans les deux implémentations). Les 7 autres consommateurs shadcn (`Login/RegisterPage`, `PaywallBanner`, `DesignSystemPage`, `ThemeToggle`, `dialog.tsx`) restent hors scope de cette FTD. |
| FTD-19 | Token `--shadow-focus` absent de `src/index.css` | 2026-04-22 | Résolu au Sprint 3.5. Ajout de `--shadow-focus: 0 0 0 3px rgba(27, 79, 216, 0.18)` dans `@theme {}` (valeur conforme à `DESIGN_SYSTEM.md §2`) et `--shadow-focus: 0 0 0 3px rgba(91, 127, 255, 0.32)` dans `.dark {}` (recalculé sur la teinte expria dark `#5B7FFF`). Tailwind 4 génère automatiquement l'utility `shadow-focus`. Migration de 5 occurrences `ring-2 ring-expria/20``shadow-focus` dans `Button.tsx`, `Card.tsx`, `SimulationForm.tsx` (×3), `SpecialCharsKeyboard.tsx`. Factorisation bonus : className dupliquée des boutons secondaires de `SimulationForm` extraite en const `secondaryActionBtn`. |
@ -395,3 +379,4 @@ Frontend :
| 1.11 | 2026-04-22 | Sprint 3.5 Clean — FTD-17, FTD-18, FTD-19 résolus. 15 FTD actives restantes (cap de 15 respecté) |
| 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é). |