expria-backend/docs/CHANGELOG-backend.md
2026-04-26 03:09:13 +03:00

7.8 KiB
Raw Blame History

Changelog — Expria Backend

Toutes les modifications notables du backend sont documentées dans ce fichier.

Format basé sur Keep a Changelog.


[Unreleased] — 2026-04-26 — Sprint 4.8 — Phonologie EO

Added

  • src/lib/geminiPhonology.ts — évaluation phonologique via Gemini 2.5 Flash (audio brut, JSON strict, timeout 45s + 1 retry). PHONOLOGY_STUB pour Mode A (transcript sans audio).
  • src/lib/__tests__/geminiPhonology.test.ts — 9 tests (parse, cap 0..4, retry, erreurs HTTP).
  • src/controllers/__tests__/correctionEoPhonology.test.ts — 4 tests (injection 5e critère, stub Mode A, fallback Gemini down, score max 20).

Changed

  • POST /corrections/eo — passe de 4 critères × /5 à 5 critères × /4 (score total /20 inchangé). Phonologie évaluée par Gemini en parallèle de la transcription (Mode B audio). Fallback stub si Gemini phonologie échoue.
  • src/lib/deepseek.ts — prompt EO : cap critère /5 → /4, libellés officiels TCF Canada, mention phonologie évaluée séparément. Cap EE inchangé /5.
  • TD-08 partiellement résolu (T1/T3). T2 Live reste à 0 (Sprint 6).

Notes

  • ⚠️ Breaking change frontend : criteres.length passe de 4 à 5, échelle /5 → /4.
  • Tests : 248 → 261 verts (+13).

[Unreleased] — 2026-04-25 — Sprint 4a/4b — Backend EO

Added

  • POST /corrections/eo aligné format Sprint 3.6a : revelation, diagnostic, criteres enrichis (exemple/suggestion/astuce), conseil_nclc adaptatif (4 niveaux selon score vs cible), erreurs_codes, jobs fire-and-forget modèle + exercices
  • POST /presentations/generate — génération présentation T1 via DeepSeek (220-260 mots, registre oral NCLC 7-8, 5 champs)
  • POST /transcriptions/token — token Deepgram éphémère (600s TTL, dormant côté frontend MVP)
  • src/lib/deepgram.ts — client Deepgram /v1/auth/grant (scope Member requis)
  • src/lib/audioStorage.ts — supprimé (audio non stocké côté serveur)
  • Migration 006_sprint_4a_eo.sql — documentation bucket Storage (no-op)

Changed

  • correctEO : accepte audioBase64+mimeType (Gemini batch) OU transcript texte
  • MIME normalisé avant validation (audio/webm;codecs=opus → audio/webm)
  • sanitizeJsonContent : gère single-quote JSON DeepSeek
  • Gemini timeout 30s → 45s, DeepSeek correctEO 55s → 90s
  • gemini-2.0-flashgemini-2.5-flash
  • conseil_nclc adaptatif EE + EO (4 niveaux : dépassé / atteint / proche / loin)
  • Tests : 205 → 248 verts (+43)

[Unreleased] — 2026-04-25 — Fix health check keepalive Supabase

Changed

  • Route GET / : ajout d'un ping Supabase (profiles.select('id', { head: true }).limit(1)) à chaque appel. Garde le pool de connexions DB actif via les pings UptimeRobot (toutes les 5 min). Réponse enrichie : { message, db: 'connected' | 'error' }. Toujours 200 (liveness, pas readiness).

[Unreleased] — 2026-04-22 — Sprint 3.6a — Qualité correction Backend

Added

  • Nouveaux prompts DeepSeek spécifiés dans docs/Prompt_maître.md et docs/Prompt_production_modèle.md — builders dynamiques buildCorrectionPrompt, buildModelPrompt, buildExercicesPrompt dans src/lib/deepseek.ts.
  • expria-frontend/docs/TAXONOMIE_ERREURS.md — 63 codes d'erreurs TCF Canada sur 4 critères + 4 codes « autre ». Validation runtime via src/lib/taxonomieErreurs.ts (isValidCode, isValidCritere, buildTaxonomyPromptSection). Codes invalides retournés par DeepSeek sont filtrés ; le code autre sans description est rejeté.
  • Génération parallèle correction + modèle — option (b) : generateProductionModele démarre en même temps que correctEE avec nclcObtenu = nclcCible - 1 comme estimation provisoire, await uniquement sur la correction pour répondre à la requête HTTP.
  • Exercices personnalisés fire-and-forget déclenchés après la résolution de la correction (dépendent de rapport.erreurs_codes et rapport.criteres). Format aligné sur les captures d'écran : {difficulte, theme, diagnostic, consigne, extrait, indice, correction, explication}.
  • Nouveaux champs dans productions : revelation (JSONB), diagnostic (TEXT), conseil_nclc (JSONB), erreurs_codes (JSONB), exercices (JSONB), modele (JSONB), nclc_cible (INTEGER), exercices_status / modele_status (TEXT, 'pending'/'ready'/'error').
  • Migration SQL supabase/migrations/004_sprint_3_6a_qualite_correction.sql — première migration versionnée du projet (cf. backend TD-06) ; idempotente grâce à IF NOT EXISTS.
  • Paramètre nclc_cible optionnel sur POST /corrections/ee (défaut 9, valeurs acceptées : 9 ou 10 ; sinon 400 VALIDATION_ERROR).
  • Index GIN sur erreurs_codes pour préparer l'agrégation du Sprint 3.6c (analyse patterns).
  • Nouveau fichier de tests src/controllers/__tests__/correctionController.test.ts — 8 tests (parallélisme option b, statuts ready/error, nclc_cible propagé, simulation introuvable, autre utilisateur).
  • 2 tests ajoutés à simulationController.test.tsgetById renvoie nclc_cible, exercices, modele + statuts.
  • Logs d'erreur détaillés : callDeepSeek classifie TIMEOUT / ABORT / JSON_PARSE / NETWORK / OTHER ; correctionController.correctEE logue {simulationId, tache, nclcCible, message, stack} avant de retourner 500.
  • FTD-23 🟡 ajoutée dans expria-frontend/docs/TECH_DEBT.mduseAutosave peut fire un PATCH /simulations/:id/contenu après correction, ce qui retourne 400 VALIDATION_ERROR. À corriger dans une session dédiée (préexistant au Sprint 3.6a, détecté lors des tests manuels).

Changed

  • correctEE dans src/lib/deepseek.ts — nouvelle signature correctEE(CorrectionInput) (contenu, tache, sujet, sourceDoc1/2, nclcCible) et nouvelle forme de retour CorrectionRapport (revelation, diagnostic, criteres avec exemple/suggestion/astuce, conseil_nclc, erreurs_codes). EERapport devient alias de CorrectionRapport. EO inchangé.
  • correctionController.correctEE — charge le sujet + documents T3 depuis Supabase pour alimenter le prompt maître ; persiste les nouveaux champs (revelation, diagnostic, conseil_nclc, erreurs_codes, nclc_cible) + statuts pending initiaux ; lance runModeleJob en parallèle (option b) et runExercicesJob après correction.
  • simulationController.getById — retourne désormais nclc_cible, exercices, exercices_status, modele, modele_status en plus du rapport enrichi ; fallback 'pending' si les colonnes sont absentes (compat avec productions pré-migration).
  • Timeout DeepSeek côté backend : callDeepSeek abort à 55 s via AbortSignal.timeout(55_000) (avant : aucun timeout) ; timeout frontend corrections monte de 30 s à 60 s — marge de 5 s entre abort backend et abort client.
  • Routes /simulations/* : réorganisation défensive — les PATCH /:id/contenu et PATCH /:id/sujet sont déclarées avant GET /:id pour éviter tout risque de masquage.
  • deepseek.test.ts réécrit (25 tests) — couvre correctEE nouvelle signature, generateProductionModele, generateExercices, helpers post-traitement, EO inchangé.

Notes

  • Option A retenue pour la compatibilité frontend : backend renvoie uniquement la nouvelle forme. Le Sprint 3.6b (frontend) est immédiatement suivant et corrige l'écran blanc sur RapportPage.
  • Option (b) retenue pour le parallélisme : modèle en parallèle avec correction (nclcObtenu estimé), exercices strictement après correction.
  • Migration SQL à exécuter manuellement via supabase db push ou SQL Editor du dashboard (cf. Règle F) — aucune exécution automatique.
  • Tests : 174 tests verts (+19 vs baseline 155), 18 fichiers de tests.
  • TD-15 🟡 ouvert : si le process redémarre pendant un job fire-and-forget (modèle/exercices), le statut reste pending indéfiniment. À traiter après observation en production.