From 8390e8b873f45fd582efbdca60e8933a255aaa32 Mon Sep 17 00:00:00 2001 From: Hermann_Kitio Date: Wed, 22 Apr 2026 17:28:02 +0300 Subject: [PATCH] =?UTF-8?q?feat(corrections):=20Sprint=203.6a=20=E2=80=94?= =?UTF-8?q?=20nouveaux=20prompts=20+=20taxonomie=20erreurs=20+=20g=C3=A9n?= =?UTF-8?q?=C3=A9ration=20parall=C3=A8le?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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) --- docs/CHANGELOG.md | 45 ++++++ docs/ROADMAP.md | 23 +++ docs/TAXONOMIE_ERREURS.md | 309 +++++++++++++++++++++++++++++++++++++ docs/TECH_DEBT.md | 25 +++ src/entities/report/api.ts | 5 +- 5 files changed, 406 insertions(+), 1 deletion(-) create mode 100644 docs/TAXONOMIE_ERREURS.md diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 741daaf..38168bd 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -37,6 +37,51 @@ Chaque entrée suit ce format : - 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` ### Added diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index 046afbb..a049e49 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -37,6 +37,29 @@ - Tests manuels Groupe B + C rejoués - 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) 16. MediaRecorder + upload audio EO T1/T3 diff --git a/docs/TAXONOMIE_ERREURS.md b/docs/TAXONOMIE_ERREURS.md new file mode 100644 index 0000000..a1c5f0f --- /dev/null +++ b/docs/TAXONOMIE_ERREURS.md @@ -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` | diff --git a/docs/TECH_DEBT.md b/docs/TECH_DEBT.md index b12a265..8fdc18d 100644 --- a/docs/TECH_DEBT.md +++ b/docs/TECH_DEBT.md @@ -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 ### 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.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.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. | diff --git a/src/entities/report/api.ts b/src/entities/report/api.ts index cfd382a..ae901fb 100644 --- a/src/entities/report/api.ts +++ b/src/entities/report/api.ts @@ -35,7 +35,10 @@ export function getReport(id: string): Promise { }) } -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`. * Payload : { simulationId, contenu, tache }