feat(corrections): Sprint 3.6a — nouveaux prompts + taxonomie erreurs + génération parallèle
Côté frontend : timeout corrections 30→60s (aligné avec backend 55s), FTD-23 documentée, TAXONOMIE_ERREURS.md ajouté. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
18f92098cb
commit
8390e8b873
5 changed files with 406 additions and 1 deletions
|
|
@ -37,6 +37,51 @@ Chaque entrée suit ce format :
|
||||||
- Code source de `src/entities/user/access.ts` et `lib.ts` avec tests
|
- Code source de `src/entities/user/access.ts` et `lib.ts` avec tests
|
||||||
|
|
||||||
|
|
||||||
|
## [Unreleased] — 2026-04-22 — Sprint 3.5 — Clean post-Sprint 3
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- **FTD-17 résolu** : `PLAN_QUERY_KEY` centralisé dans `src/entities/user/query-keys.ts` (constantes pures, aucun import runtime). `usePlan` le ré-exporte ; `SimulationPage` et `RapportPage` remplacent leur `useQuery` inline par le hook `usePlan()` — déduplication totale de la clé et de la config `staleTime`.
|
||||||
|
- **FTD-18 résolu** : `SimulationForm` migré de `@/shared/components/ui/button` (shadcn) vers la primitive canonique `@/shared/ui/Button`. Aucun variant à adapter (usage sans prop `variant`).
|
||||||
|
- **FTD-19 résolu** : token `--shadow-focus` ajouté dans `@theme {}` (`0 0 0 3px rgba(27, 79, 216, 0.18)` — conforme `DESIGN_SYSTEM.md §2`) et dans `.dark {}` (recalculé sur la teinte expria dark). Migration de 5 occurrences `ring-2 ring-expria/20` → utility `shadow-focus` dans `Button`, `Card`, `SimulationForm` (×3), `SpecialCharsKeyboard`.
|
||||||
|
- Factorisation `SimulationForm` : className dupliquée des deux boutons secondaires (« Suggestions d'idées » / « Changer de sujet ») extraite en const locale `secondaryActionBtn`.
|
||||||
|
- `TECH_DEBT.md` → v1.11. 15 FTD actives (cap de 15 respecté).
|
||||||
|
|
||||||
|
### Notes
|
||||||
|
- Timeouts DeepSeek intermittents observés pendant les tests manuels Groupe B + C — cause externe (API tierce), hors périmètre refactor Sprint 3.5.
|
||||||
|
- B8 : comportement actuel diffère du spec `PARCOURS_UTILISATEURS.md §2 "Quota atteint"` — affichage d'une bannière inline au lieu du modal de blocage attendu. À corriger dans un sprint dédié (non inclus dans ce clean, qui n'introduit aucune nouvelle fonctionnalité).
|
||||||
|
|
||||||
|
|
||||||
|
## [Unreleased] — 2026-04-22 — Sprint 3.6a — Qualité correction — Backend
|
||||||
|
|
||||||
|
### Added (backend)
|
||||||
|
- `src/lib/taxonomieErreurs.ts` : constantes des 63 codes TCF Canada + 4 codes `autre` par critère, validation runtime `isValidCode` / `isValidCritere`, et injection au prompt via `buildTaxonomyPromptSection`.
|
||||||
|
- Prompts dynamiques dans `src/lib/deepseek.ts` : `buildCorrectionPrompt` (prompt maître avec `nclc_cible` 9 ou 10, sujet, documents T3), `buildModelPrompt` (production modèle cible NCLC 9 fixe), `buildExercicesPrompt` (3 exercices ciblés sur `erreurs_codes` + extraits `exemple`, format `{difficulte, theme, diagnostic, consigne, extrait, indice, correction, explication}`).
|
||||||
|
- Post-traitement production modèle : `wordCountTCF`, `stripModelAnnotations`, `truncateToMaxWords`.
|
||||||
|
- Route `POST /corrections/ee` accepte le paramètre `nclc_cible` (optionnel, défaut 9, valeurs acceptées : 9 ou 10 ; sinon 400 VALIDATION_ERROR).
|
||||||
|
- Migration SQL `supabase/migrations/004_sprint_3_6a_qualite_correction.sql` — colonnes : `revelation`, `diagnostic`, `conseil_nclc`, `erreurs_codes`, `exercices`, `modele`, `nclc_cible`, `exercices_status`, `modele_status` + index GIN sur `erreurs_codes` (pour Sprint 3.6c).
|
||||||
|
- `controllers/__tests__/correctionController.test.ts` (7 tests) : parallélisme, statuts ready/error, `nclc_cible=10` propagé, simulation introuvable/autre user.
|
||||||
|
- `docs/TECH_DEBT.md` TD-15 🟡 : jobs fire-and-forget peuvent rester `pending` si redémarrage process.
|
||||||
|
|
||||||
|
### Changed (backend)
|
||||||
|
- `correctEE` dans `deepseek.ts` — nouvelle signature `correctEE(CorrectionInput)` + nouvelle forme `CorrectionRapport` (revelation, diagnostic, criteres[{exemple,suggestion,astuce}], conseil_nclc, erreurs_codes). `EERapport` devient alias de `CorrectionRapport`.
|
||||||
|
- `correctionController.correctEE` : lance 3 appels DeepSeek en parallèle ; await uniquement sur la correction pour répondre 200 ; modèle et exercices s'exécutent en fire-and-forget et mettent à jour `{exercices,exercices_status}` et `{modele,modele_status}` en base (pending → ready/error).
|
||||||
|
- `simulationController.getById` retourne les nouveaux champs : `nclc_cible`, `exercices`, `exercices_status`, `modele`, `modele_status` en plus du `rapport` enrichi.
|
||||||
|
- `deepseek.test.ts` réécrit — 25 tests (ancien pipeline supprimé, nouveaux tests sur correctEE/generateProductionModele/generateExercices/helpers + EO inchangé).
|
||||||
|
|
||||||
|
### Notes
|
||||||
|
- **Option A retenue** : backend renvoie uniquement la nouvelle forme. Frontend (Sprint 3.6b) casse tant que non livré — livraison groupée sans déploiement intermédiaire.
|
||||||
|
- Prompt exercices rédigé côté backend (option b), basé sur les codes taxonomie + extraits `exemple` des critères. Format aligné sur captures d'écran demandées.
|
||||||
|
- Migration SQL à exécuter manuellement via `supabase db push` — Hermann avant le premier test end-to-end.
|
||||||
|
- Tests backend : 173/173 verts (+18 vs baseline de 155).
|
||||||
|
|
||||||
|
|
||||||
|
## [Unreleased] — 2026-04-22 — Planification Sprint 3.6a/3.6b/3.6c
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- Sprints 3.6a (backend prompts + taxonomie), 3.6b (frontend rapport enrichi), 3.6c (analyse patterns Premium) ajoutés à la ROADMAP entre Sprint 3.5 et Sprint 4.
|
||||||
|
- `TAXONOMIE_ERREURS.md` — 63 codes d'erreurs TCF Canada sur 4 critères + 4 codes « autre » + procédure d'enrichissement.
|
||||||
|
|
||||||
|
|
||||||
## 2026-04-21 — FTD-21 — Persistance session `/simulation/ee`
|
## 2026-04-21 — FTD-21 — Persistance session `/simulation/ee`
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
|
||||||
|
|
@ -37,6 +37,29 @@
|
||||||
- Tests manuels Groupe B + C rejoués
|
- Tests manuels Groupe B + C rejoués
|
||||||
- Commit refactor(simulation-ee)
|
- Commit refactor(simulation-ee)
|
||||||
|
|
||||||
|
## Sprint 3.6a — Qualité correction — Backend ✅
|
||||||
|
- Remplacement prompt maître (docs/Prompt_maître.md) + intégration taxonomie erreurs (docs/TAXONOMIE_ERREURS.md)
|
||||||
|
- Remplacement prompt production modèle (docs/Prompt_production_modèle.md) — cible fixe NCLC 9
|
||||||
|
- Génération parallèle correction + exercices + modèle (await correction, fire-and-forget sur les deux autres)
|
||||||
|
- Nouveaux champs DB : revelation, diagnostic, conseil_nclc, erreurs_codes, exercices_status, modele_status, nclc_cible
|
||||||
|
- Mise à jour GET /simulations/:id
|
||||||
|
- Migration SQL : `supabase/migrations/004_sprint_3_6a_qualite_correction.sql` (à exécuter manuellement)
|
||||||
|
- Tests : 173 tests verts (+18 vs baseline)
|
||||||
|
|
||||||
|
## Sprint 3.6b — Qualité correction — Frontend
|
||||||
|
- Sélecteur NCLC cible dans SimulationForm (9 ou 10, défaut 9)
|
||||||
|
- RapportPage enrichie : revelation, diagnostic, conseil_nclc, jauge NCLC
|
||||||
|
- Exercices dynamiques : indice, correction, explication
|
||||||
|
- Production modèle : notes_pedagogiques, transformations, message
|
||||||
|
- Gating plan : exercices + modèle floutés Free
|
||||||
|
|
||||||
|
## Sprint 3.6c — Analyse patterns (Premium)
|
||||||
|
- Backend : GET /users/patterns — agrégation SQL erreurs_codes sur 5 dernières productions
|
||||||
|
- Backend : exercices long terme générés par DeepSeek sur patterns confirmés (≥ 3/5)
|
||||||
|
- Backend : indice de préparation 0→100
|
||||||
|
- Frontend : Dashboard Premium — section "Mon profil de préparation"
|
||||||
|
- Frontend : erreurs récurrentes + exercices long terme + indice
|
||||||
|
|
||||||
## Sprint 4 — Simulations EO (audio)
|
## Sprint 4 — Simulations EO (audio)
|
||||||
16. MediaRecorder + upload audio EO T1/T3
|
16. MediaRecorder + upload audio EO T1/T3
|
||||||
|
|
||||||
|
|
|
||||||
309
docs/TAXONOMIE_ERREURS.md
Normal file
309
docs/TAXONOMIE_ERREURS.md
Normal file
|
|
@ -0,0 +1,309 @@
|
||||||
|
# TAXONOMIE_ERREURS.md — Expria V2
|
||||||
|
|
||||||
|
> **Document de référence — Version 1.0**
|
||||||
|
> Taxonomie fermée des erreurs détectables en expression écrite TCF Canada.
|
||||||
|
> Utilisée par le prompt maître pour nommer les erreurs de façon stable et agrégeable.
|
||||||
|
> Mise à jour après observation de nouveaux patterns en production.
|
||||||
|
>
|
||||||
|
> **Principe :** DeepSeek doit obligatoirement choisir un code dans cette liste pour chaque erreur identifiée.
|
||||||
|
> Si l'erreur ne correspond à aucun code existant, DeepSeek utilise le code `autre` du critère concerné
|
||||||
|
> et fournit une description textuelle. Ces occurrences sont remontées pour enrichissement de la taxonomie.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Structure d'une erreur dans le rapport
|
||||||
|
|
||||||
|
Chaque erreur retournée par le prompt maître doit respecter ce format :
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"code": "virgule_exces",
|
||||||
|
"critere": "competence_grammaticale",
|
||||||
|
"description": "description libre si code=autre, null sinon"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Critère 1 — Adéquation à la tâche et au registre
|
||||||
|
|
||||||
|
`critere: "adequation_tache"`
|
||||||
|
|
||||||
|
### Contenu
|
||||||
|
| Code | Description |
|
||||||
|
|---|---|
|
||||||
|
| `hors_sujet_total` | La production ne répond pas à la consigne |
|
||||||
|
| `hors_sujet_partiel` | Un ou plusieurs points de la consigne sont ignorés |
|
||||||
|
| `information_manquante` | Une information demandée explicitement dans la consigne est absente |
|
||||||
|
| `enonce_copie` | Le candidat recopie l'énoncé au lieu de le reformuler |
|
||||||
|
|
||||||
|
### Longueur
|
||||||
|
| Code | Description |
|
||||||
|
|---|---|
|
||||||
|
| `longueur_insuffisante` | Sous le minimum de mots requis (score plafonné automatiquement) |
|
||||||
|
| `longueur_excessive` | Au-dessus du maximum de mots requis |
|
||||||
|
|
||||||
|
### Format
|
||||||
|
| Code | Description |
|
||||||
|
|---|---|
|
||||||
|
| `format_non_respecte` | Type de texte non respecté (mail sans objet, blog sans accroche) |
|
||||||
|
| `salutation_absente` | Pas de formule d'appel |
|
||||||
|
| `cloture_absente` | Pas de formule de clôture ou de signature |
|
||||||
|
| `structure_absente` | Texte bloc sans paragraphes |
|
||||||
|
|
||||||
|
### Registre
|
||||||
|
| Code | Description |
|
||||||
|
|---|---|
|
||||||
|
| `registre_trop_formel` | Registre soutenu alors que familier requis |
|
||||||
|
| `registre_trop_familier` | Registre familier alors que formel requis |
|
||||||
|
| `abreviations_sms` | Usage de "bjr", "svp", "stp" hors contexte très informel |
|
||||||
|
| `tutoiement_inadequat` | Tutoiement quand vouvoiement requis, ou inversement |
|
||||||
|
|
||||||
|
### Non couvert
|
||||||
|
| Code | Description |
|
||||||
|
|---|---|
|
||||||
|
| `autre` | Erreur d'adéquation non couverte par la taxonomie — **description obligatoire** |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Critère 2 — Cohérence et cohésion du discours
|
||||||
|
|
||||||
|
`critere: "coherence_cohesion"`
|
||||||
|
|
||||||
|
### Structure
|
||||||
|
| Code | Description |
|
||||||
|
|---|---|
|
||||||
|
| `introduction_absente` | Pas d'entrée en matière ou d'accroche |
|
||||||
|
| `conclusion_absente` | Pas de clôture ou de phrase de synthèse |
|
||||||
|
| `paragraphes_absents` | Texte bloc sans découpage en paragraphes |
|
||||||
|
| `progression_illogique` | Les idées ne s'enchaînent pas dans un ordre logique |
|
||||||
|
|
||||||
|
### Connecteurs
|
||||||
|
| Code | Description |
|
||||||
|
|---|---|
|
||||||
|
| `connecteurs_absents` | Phrases juxtaposées sans lien logique |
|
||||||
|
| `connecteurs_repetes` | Même connecteur utilisé en boucle (ex : "et" x5) |
|
||||||
|
| `connecteurs_inadequats` | Connecteur utilisé à contresens (ex : "donc" pour introduire une cause) |
|
||||||
|
| `connecteurs_insuffisants` | Connecteurs trop simples pour le niveau visé (uniquement "mais", "et", "car") |
|
||||||
|
|
||||||
|
### Cohérence thématique
|
||||||
|
| Code | Description |
|
||||||
|
|---|---|
|
||||||
|
| `idee_non_developpee` | Idée introduite puis abandonnée sans explication |
|
||||||
|
| `repetition_idee` | Même idée reformulée plusieurs fois sans apport nouveau |
|
||||||
|
| `contradiction_interne` | Deux affirmations contradictoires dans le même texte |
|
||||||
|
| `hors_propos` | Phrase ou paragraphe sans lien avec le reste du texte |
|
||||||
|
|
||||||
|
### Cohésion référentielle
|
||||||
|
| Code | Description |
|
||||||
|
|---|---|
|
||||||
|
| `pronoms_ambigus` | "il", "elle", "ils" sans antécédent clair |
|
||||||
|
| `substitution_absente` | Même mot répété au lieu d'utiliser un pronom ou un synonyme |
|
||||||
|
| `rupture_temporelle` | Mélange incohérent des temps dans le récit |
|
||||||
|
|
||||||
|
### Non couvert
|
||||||
|
| Code | Description |
|
||||||
|
|---|---|
|
||||||
|
| `autre` | Erreur de cohérence/cohésion non couverte par la taxonomie — **description obligatoire** |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Critère 3 — Compétence lexicale
|
||||||
|
|
||||||
|
`critere: "competence_lexicale"`
|
||||||
|
|
||||||
|
### Étendue du vocabulaire
|
||||||
|
| Code | Description |
|
||||||
|
|---|---|
|
||||||
|
| `vocabulaire_basique` | Mots trop simples pour le niveau visé (ex : "bien" au lieu de "remarquable") |
|
||||||
|
| `vocabulaire_insuffisant` | Manque de mots pour exprimer une idée, recours à des périphrases maladroites |
|
||||||
|
| `registre_lexical_inadequat` | Mots familiers dans un contexte formel, ou inversement |
|
||||||
|
|
||||||
|
### Précision
|
||||||
|
| Code | Description |
|
||||||
|
|---|---|
|
||||||
|
| `mot_imprecis` | Mot approximatif (ex : "faire" au lieu de "effectuer", "réaliser", "accomplir") |
|
||||||
|
| `contresens_lexical` | Mot utilisé dans un sens erroné |
|
||||||
|
| `anglicisme` | Mot anglais utilisé à la place du mot français (ex : "checker" au lieu de "vérifier") |
|
||||||
|
| `calque_syntaxique` | Construction calquée sur une autre langue |
|
||||||
|
|
||||||
|
### Variété
|
||||||
|
| Code | Description |
|
||||||
|
|---|---|
|
||||||
|
| `repetition_lexicale` | Même mot répété excessivement dans le texte |
|
||||||
|
| `synonymes_absents` | Absence de variation lexicale sur un même champ sémantique |
|
||||||
|
| `expressions_figees_absentes` | Absence d'expressions idiomatiques attendues au niveau visé |
|
||||||
|
|
||||||
|
### Orthographe lexicale
|
||||||
|
| Code | Description |
|
||||||
|
|---|---|
|
||||||
|
| `faute_orthographe_courante` | Erreur sur un mot courant (ex : "apelle" au lieu de "appelle") |
|
||||||
|
| `confusion_homophones` | "sa"/"ça", "a"/"à", "ou"/"où", "ce"/"se", "on"/"ont" |
|
||||||
|
| `majuscules_incorrectes` | Majuscule absente ou mal placée |
|
||||||
|
|
||||||
|
### Non couvert
|
||||||
|
| Code | Description |
|
||||||
|
|---|---|
|
||||||
|
| `autre` | Erreur lexicale non couverte par la taxonomie — **description obligatoire** |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Critère 4 — Compétence grammaticale
|
||||||
|
|
||||||
|
`critere: "competence_grammaticale"`
|
||||||
|
|
||||||
|
### Accords
|
||||||
|
| Code | Description |
|
||||||
|
|---|---|
|
||||||
|
| `accord_sujet_verbe` | "les enfants joue" au lieu de "jouent" |
|
||||||
|
| `accord_adjectif_nom` | "une révolution positif" au lieu de "positive" |
|
||||||
|
| `accord_participe_passe` | "elle est parti" au lieu de "partie" |
|
||||||
|
| `accord_determinant_nom` | "un table" au lieu de "une table" |
|
||||||
|
|
||||||
|
### Conjugaison
|
||||||
|
| Code | Description |
|
||||||
|
|---|---|
|
||||||
|
| `temps_verbal_inadequat` | Présent au lieu de passé composé, futur au lieu de conditionnel |
|
||||||
|
| `subjonctif_absent` | Indicatif utilisé là où le subjonctif est requis |
|
||||||
|
| `subjonctif_incorrect` | Subjonctif utilisé mais mal formé |
|
||||||
|
| `conditionnel_absent` | Conditionnel requis mais absent (politesse, hypothèse) |
|
||||||
|
| `concordance_temps` | Incohérence des temps dans un même passage |
|
||||||
|
|
||||||
|
### Syntaxe
|
||||||
|
| Code | Description |
|
||||||
|
|---|---|
|
||||||
|
| `phrase_incomplete` | Phrase sans verbe conjugué ou sans sujet |
|
||||||
|
| `phrase_trop_longue` | Phrase surchargée, incompréhensible |
|
||||||
|
| `ordre_mots_incorrect` | "je ne sais pas où est-il" au lieu de "où il est" |
|
||||||
|
| `subordination_absente` | Phrases simples juxtaposées là où une subordonnée est attendue |
|
||||||
|
| `subordination_incorrecte` | Connecteur de subordination mal utilisé |
|
||||||
|
|
||||||
|
### Ponctuation
|
||||||
|
| Code | Description |
|
||||||
|
|---|---|
|
||||||
|
| `virgule_exces` | Virgules à outrance qui coupent le flux naturel |
|
||||||
|
| `virgule_absence` | Absence de virgule là où elle est requise |
|
||||||
|
| `point_absent` | Phrases non délimitées, texte continu sans point |
|
||||||
|
| `ponctuation_incorrecte` | Usage erroné de ";" ":" "!" "?" |
|
||||||
|
|
||||||
|
### Prépositions
|
||||||
|
| Code | Description |
|
||||||
|
|---|---|
|
||||||
|
| `preposition_absente` | "je pense que c'est important aller" au lieu de "d'aller" |
|
||||||
|
| `preposition_incorrecte` | "je rêve à partir" au lieu de "de partir" |
|
||||||
|
| `preposition_superflue` | Préposition ajoutée inutilement |
|
||||||
|
|
||||||
|
### Morphologie
|
||||||
|
| Code | Description |
|
||||||
|
|---|---|
|
||||||
|
| `genre_incorrect` | "la problème" au lieu de "le problème" |
|
||||||
|
| `nombre_incorrect` | Pluriel absent ou mal formé |
|
||||||
|
| `negation_incomplete` | "je sais pas" au lieu de "je ne sais pas" |
|
||||||
|
|
||||||
|
### Non couvert
|
||||||
|
| Code | Description |
|
||||||
|
|---|---|
|
||||||
|
| `autre` | Erreur grammaticale non couverte par la taxonomie — **description obligatoire** |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Règles d'utilisation pour DeepSeek
|
||||||
|
|
||||||
|
1. **Chaque erreur identifiée dans un rapport doit avoir un code de cette liste.**
|
||||||
|
2. **Un seul code par erreur** — choisir le plus précis.
|
||||||
|
3. **Le code `autre` est autorisé** mais exige une `description` textuelle non nulle.
|
||||||
|
4. **Les codes `autre` observés en production** sont remontés à Hermann pour décision d'intégration.
|
||||||
|
5. **La détection de patterns** (analyse multi-productions) agrège les codes — un pattern est confirmé si le même code apparaît dans ≥ 3 productions sur les 5 dernières.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Procédure d'enrichissement
|
||||||
|
|
||||||
|
Quand un code `autre` revient ≥ 3 fois en production :
|
||||||
|
|
||||||
|
1. Hermann identifie le pattern dans les logs
|
||||||
|
2. Un nouveau code est proposé et validé
|
||||||
|
3. `TAXONOMIE_ERREURS.md` est mis à jour (bump de version)
|
||||||
|
4. Le prompt maître est mis à jour dans le même commit
|
||||||
|
5. Les anciennes entrées `autre` concernées sont reclassifiées si possible
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Index des codes (référence rapide)
|
||||||
|
|
||||||
|
| Code | Critère |
|
||||||
|
|---|---|
|
||||||
|
| `hors_sujet_total` | adequation_tache |
|
||||||
|
| `hors_sujet_partiel` | adequation_tache |
|
||||||
|
| `information_manquante` | adequation_tache |
|
||||||
|
| `enonce_copie` | adequation_tache |
|
||||||
|
| `longueur_insuffisante` | adequation_tache |
|
||||||
|
| `longueur_excessive` | adequation_tache |
|
||||||
|
| `format_non_respecte` | adequation_tache |
|
||||||
|
| `salutation_absente` | adequation_tache |
|
||||||
|
| `cloture_absente` | adequation_tache |
|
||||||
|
| `structure_absente` | adequation_tache |
|
||||||
|
| `registre_trop_formel` | adequation_tache |
|
||||||
|
| `registre_trop_familier` | adequation_tache |
|
||||||
|
| `abreviations_sms` | adequation_tache |
|
||||||
|
| `tutoiement_inadequat` | adequation_tache |
|
||||||
|
| `introduction_absente` | coherence_cohesion |
|
||||||
|
| `conclusion_absente` | coherence_cohesion |
|
||||||
|
| `paragraphes_absents` | coherence_cohesion |
|
||||||
|
| `progression_illogique` | coherence_cohesion |
|
||||||
|
| `connecteurs_absents` | coherence_cohesion |
|
||||||
|
| `connecteurs_repetes` | coherence_cohesion |
|
||||||
|
| `connecteurs_inadequats` | coherence_cohesion |
|
||||||
|
| `connecteurs_insuffisants` | coherence_cohesion |
|
||||||
|
| `idee_non_developpee` | coherence_cohesion |
|
||||||
|
| `repetition_idee` | coherence_cohesion |
|
||||||
|
| `contradiction_interne` | coherence_cohesion |
|
||||||
|
| `hors_propos` | coherence_cohesion |
|
||||||
|
| `pronoms_ambigus` | coherence_cohesion |
|
||||||
|
| `substitution_absente` | coherence_cohesion |
|
||||||
|
| `rupture_temporelle` | coherence_cohesion |
|
||||||
|
| `vocabulaire_basique` | competence_lexicale |
|
||||||
|
| `vocabulaire_insuffisant` | competence_lexicale |
|
||||||
|
| `registre_lexical_inadequat` | competence_lexicale |
|
||||||
|
| `mot_imprecis` | competence_lexicale |
|
||||||
|
| `contresens_lexical` | competence_lexicale |
|
||||||
|
| `anglicisme` | competence_lexicale |
|
||||||
|
| `calque_syntaxique` | competence_lexicale |
|
||||||
|
| `repetition_lexicale` | competence_lexicale |
|
||||||
|
| `synonymes_absents` | competence_lexicale |
|
||||||
|
| `expressions_figees_absentes` | competence_lexicale |
|
||||||
|
| `faute_orthographe_courante` | competence_lexicale |
|
||||||
|
| `confusion_homophones` | competence_lexicale |
|
||||||
|
| `majuscules_incorrectes` | competence_lexicale |
|
||||||
|
| `accord_sujet_verbe` | competence_grammaticale |
|
||||||
|
| `accord_adjectif_nom` | competence_grammaticale |
|
||||||
|
| `accord_participe_passe` | competence_grammaticale |
|
||||||
|
| `accord_determinant_nom` | competence_grammaticale |
|
||||||
|
| `temps_verbal_inadequat` | competence_grammaticale |
|
||||||
|
| `subjonctif_absent` | competence_grammaticale |
|
||||||
|
| `subjonctif_incorrect` | competence_grammaticale |
|
||||||
|
| `conditionnel_absent` | competence_grammaticale |
|
||||||
|
| `concordance_temps` | competence_grammaticale |
|
||||||
|
| `phrase_incomplete` | competence_grammaticale |
|
||||||
|
| `phrase_trop_longue` | competence_grammaticale |
|
||||||
|
| `ordre_mots_incorrect` | competence_grammaticale |
|
||||||
|
| `subordination_absente` | competence_grammaticale |
|
||||||
|
| `subordination_incorrecte` | competence_grammaticale |
|
||||||
|
| `virgule_exces` | competence_grammaticale |
|
||||||
|
| `virgule_absence` | competence_grammaticale |
|
||||||
|
| `point_absent` | competence_grammaticale |
|
||||||
|
| `ponctuation_incorrecte` | competence_grammaticale |
|
||||||
|
| `preposition_absente` | competence_grammaticale |
|
||||||
|
| `preposition_incorrecte` | competence_grammaticale |
|
||||||
|
| `preposition_superflue` | competence_grammaticale |
|
||||||
|
| `genre_incorrect` | competence_grammaticale |
|
||||||
|
| `nombre_incorrect` | competence_grammaticale |
|
||||||
|
| `negation_incomplete` | competence_grammaticale |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Historique de ce document
|
||||||
|
|
||||||
|
| Version | Date | Changements |
|
||||||
|
|---|---|---|
|
||||||
|
| 1.0 | 2026-04-22 | Création initiale — 4 critères, 63 codes + 4 codes `autre` |
|
||||||
|
|
@ -183,6 +183,30 @@ Vient du pattern `c.json(result, result.status)` où `result` contient déjà `s
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
### FTD-23 — `useAutosave` continue après correction → 400 VALIDATION_ERROR
|
||||||
|
**Priorité :** 🟡 Important
|
||||||
|
**Statut :** Ouvert — pré-existant au Sprint 3.6a, détecté lors des tests manuels 3.6a
|
||||||
|
**Estimation de session :** 30 min
|
||||||
|
**Description :** Le hook `useAutosave` (cf. `src/features/simulations/hooks/useAutosave.ts`) peut déclencher un `PATCH /simulations/:id/contenu` après que la correction a été persistée (colonne `rapport !== null`). Le backend refuse alors avec `400 VALIDATION_ERROR` message « Cette simulation a déjà été corrigée. » (cf. `simulationController.autosaveContenu` backend lignes 248-255).
|
||||||
|
|
||||||
|
**Scénario déclencheur :**
|
||||||
|
1. L'utilisateur soumet sa production → `rapport` persisté côté backend.
|
||||||
|
2. `SimulationForm` passe `step` à `'done'`, mais :
|
||||||
|
- Le timer d'autosave debouncé (30 s) peut encore fire après cette transition si le debounce n'est pas clear.
|
||||||
|
- Un `beforeunload` handler peut déclencher un `flush()` final même une fois la correction reçue.
|
||||||
|
3. `useAutosave.enabled` est calculé comme `!isSubmitting` dans `SimulationForm` — il redevient `true` après la correction (quand `isSubmitting` repasse à `false`).
|
||||||
|
|
||||||
|
**À faire :**
|
||||||
|
- Propager `enabled = !isSubmitting && step !== 'done' && step !== 'correcting'` depuis `SimulationForm`
|
||||||
|
- OU : au montage, quand `rapport` devient non null après correction, clear le timeout debouncé et retirer le handler `beforeunload` immédiatement.
|
||||||
|
- Ajouter un test regression dans `useAutosave.test.ts` qui vérifie qu'aucun `autosaveContenu` n'est appelé après `step='done'`.
|
||||||
|
|
||||||
|
**Impact actuel :** erreur 400 dans les DevTools Network uniquement (pas d'impact UX — le texte est déjà corrigé, la sauvegarde n'est plus nécessaire). Pollue les logs frontend et backend.
|
||||||
|
|
||||||
|
**Condition de résolution :** session dédiée — ne bloque pas le Sprint 3.6b.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## 3. Fonctionnalités reportées
|
## 3. Fonctionnalités reportées
|
||||||
|
|
||||||
### FTD-06 — AudioWorklet au lieu de ScriptProcessorNode (T2 Live)
|
### FTD-06 — AudioWorklet au lieu de ScriptProcessorNode (T2 Live)
|
||||||
|
|
@ -349,3 +373,4 @@ Frontend :
|
||||||
| 1.9 | 2026-04-21 | FTD-22 résolu partiellement (nettoyage code orphelin refonte `/sujets` — `SujetSelector` + `selectSujet` supprimés ; `choosing-subject` + `goToSubjectPicker` conservés) |
|
| 1.9 | 2026-04-21 | FTD-22 résolu partiellement (nettoyage code orphelin refonte `/sujets` — `SujetSelector` + `selectSujet` supprimés ; `choosing-subject` + `goToSubjectPicker` conservés) |
|
||||||
| 1.10 | 2026-04-21 | FTD-21 résolu partiellement pour `/simulation/ee` (autosave 30 s + `beforeunload` + reprise via `localStorage` + `PATCH /:id/contenu` + `PATCH /:id/sujet` + `getById` tolère `rapport=null`) ; EO + examen restent ouverts |
|
| 1.10 | 2026-04-21 | FTD-21 résolu partiellement pour `/simulation/ee` (autosave 30 s + `beforeunload` + reprise via `localStorage` + `PATCH /:id/contenu` + `PATCH /:id/sujet` + `getById` tolère `rapport=null`) ; EO + examen restent ouverts |
|
||||||
| 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.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. |
|
||||||
|
|
|
||||||
|
|
@ -35,7 +35,10 @@ export function getReport(id: string): Promise<Report> {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
const CORRECTION_TIMEOUT_MS = 30_000
|
// Sprint 3.6a — le nouveau prompt maître (taxonomie + revelation + diagnostic +
|
||||||
|
// criteres×6 champs + conseil_nclc + erreurs_codes) produit un JSON long ;
|
||||||
|
// DeepSeek met typiquement 25-45 s pour répondre. Backend abort à 55 s.
|
||||||
|
const CORRECTION_TIMEOUT_MS = 60_000
|
||||||
|
|
||||||
/** Soumet une production écrite pour correction. Endpoint : `POST /corrections/ee`.
|
/** Soumet une production écrite pour correction. Endpoint : `POST /corrections/ee`.
|
||||||
* Payload : { simulationId, contenu, tache }
|
* Payload : { simulationId, contenu, tache }
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue