Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 28 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,34 @@

---

## 🔍 6 juin 2026 — Audit complet avant la pause : on vérifie que tout tient avant de couper (THI-342)
*PR #375 · security-auditor 9.4/10 · content-auditor · mobile-responsive-auditor · route-attack-auditor · Sentry · e2e Chrome*

Avant une pause de maintenance (l'outil reste en ligne mais sans correctifs rapides pendant un temps), on a passé l'application au crible pour garantir que **tout ce qui est en ligne fonctionne parfaitement**. Cinq angles d'audit en parallèle + un test de bout en bout dans le navigateur.

- **Sécurité : solide.** Audit black-hat complet (OWASP, CSP, RLS, auth, chaîne d'approvisionnement) → **9.4/10, zéro faille critique**. Les 8 livraisons du 4 juin sont toutes confirmées sûres. Un signalement « SSRF » sur le tunnel d'erreurs s'est révélé être un **faux positif** après vérification du code (l'URL de destination est figée en dur, la valeur fournie par le client ne l'atteint jamais). **Décision : on ne touche pas aux routes serveur** — modifier du code déjà sûr juste avant une pause ajoute du risque pour un gain nul.
- **Mobile (THI-342) : corrigé.** Le formulaire de signalement débordait sur iPhone. Cause : le champ de description était en 14px, et **iOS Safari zoome automatiquement tout champ sous 16px** au focus, ce qui décalait la mise en page. Passé en 16px sur mobile (14px conservé sur ordinateur). Au passage, une cible tactile de menu sécurisée à 44px.
- **Honnêteté de diagnostic.** Une seconde hypothèse (le nom de fichier du screenshot qui déborderait) a été **testée puis écartée empiriquement** — la troncature CSS le gère déjà. On documente ce qu'on a vérifié, pas ce qu'on suppose.
- **Contenu pédagogique.** Deux petits défauts d'affichage repérés dans la leçon « Scripts » (le simulateur n'exécute pas encore `./script.sh` ni la redirection `2>`) : **non bloquants** (la leçon se valide quand même), à polir à la reprise.
- **Monitoring & santé.** Sentry de production : **propre** (un seul événement bénin, auto-réparé). Parcours cœur (accueil → tableau de bord → leçon → **le terminal s'exécute**) : zéro erreur.

Décision produit : les chantiers nouveaux et **irréversibles** (suppression de compte RGPD THI-345, gestion CRUD des classes/institutions THI-347) sont **différés** après la reprise — on ne met pas de l'irréversible en ligne juste avant une fenêtre sans correctifs.

---

## 🗂️ 4 juin 2026 — Journée dense : tableau de bord analytics, navigation mobile repensée, profil éditable
*PRs #368→#374 · THI-234 · THI-341 · THI-344 · THI-346 · THI-347 · THI-334*

Huit livraisons en une journée, toutes vérifiées (sécurité, UI, revue de code, validation visuelle).

- **Tableau de bord analytics (THI-234)** : widgets « Santé Supabase » + carte de chaleur d'activité dans le panneau d'administration — agrégats anonymes, aucune donnée individuelle, via des fonctions base sécurisées (rôle vérifié côté serveur). Budget 0 €.
- **Navigation mobile repensée (THI-341)** : la barre latérale se concentre sur l'essentiel (tableau de bord, référence, **modules/leçons**, environnement) ; le secondaire (profil, paramètres, aide, signalements, déconnexion) passe dans un **menu avatar façon GitHub**. Construit en React/Tailwind « maison » pour rester compatible avec la politique de sécurité stricte (pas de styles injectés).
- **Profil éditable (THI-344)** : on peut enfin modifier son nom affiché depuis « Mon Profil », avec correction du contraste du champ en thème sombre.
- **Correctif menu (THI-346)** : suppression d'une barre de défilement redondante sur le menu avatar.
- **Suppression de signalement + fix racine (THI-347 volet 3 / THI-334)** : le mainteneur peut supprimer un ticket depuis le triage. La migration associée corrige aussi **à la racine** une pollution de la base par les tests (le nettoyage de fin de test échouait silencieusement faute de droit de suppression).

---

## 📋 2 juin 2026 — Tes signalements suivis : l'utilisateur voit où en sont ses retours (THI-325)
*PR #366 · /app/support · useMySupportTickets · ticketDisplay (source unique badges/libellés) · security-auditor 9.6/10 (isolation RLS prouvée REST+JWT) + ui-auditor + code-review + Voie A desktop/tablette/mobile 390px*

Expand Down
2 changes: 1 addition & 1 deletion docs/README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Documentation Index — Terminal Learning

> Last updated: 2 juin 2026 CEST — **🗂️ Sprint 2.C étape 4 — triage signalements super_admin (THI-320, PR #364)** : section « Signalements » dans `/app/admin` (liste + filtre statut + capture re-signée au read + statut journalisé `admin_audit_log`). **Système support complet** (formulaire → stockage → email → triage). Dropdown statut : Radix Select écarté (style inline → CSP `style-src` stricte) → `<select>` natif `[color-scheme:dark]`, CSP intacte, 0 dép. Gates : security 9.5/10 · ui SHIP · mobile · code-reviewer · Voie A e2e « 2 sens » (desktop+mobile). Suite : THI-325 (visibilité user). — **Update précédent (1er juin 2026 CEST)** — **📧 Sprint 2.C étape 3 — notification email support (THI-319, PR #360)** : à la création d'un ticket, le super_admin reçoit un email (Resend). Implémenté en **route Vercel Edge** `api/support/notify.ts` (pivot vs Edge Function Supabase : clé Resend déjà en env Vercel + `api/*` déjà serverless → 0 plateforme/dépendance/secret nouveau). **Autorisation déléguée à RLS** (JWT user forwardé à PostgREST, ligne renvoyée seulement si owner/super_admin, aucun `service_role`). Anti-replay 60s + rate-limit 10/min/IP + description HTML-escaped + `no-store` + best-effort. **3 gates 0C/0H** (security 9.2/10 · route-attack ship · code-review clean) + **email réellement reçu** (Gmail MCP) + smoke prod 200. **THI-319 Done — reste l'étape 4** (section Tickets AdminPanel, THI-320). Aussi 1er juin : session fiabilité (THI-310/315/313, PRs #353-355), cohérence catalogue fermant THI-293 (THI-316, #357), filtre crawler Sentry (THI-317, #358). — **Update précédent (30 May 2026 ~14h CEST)** — **🚀 Sprint 2.C étape 2 — signalement in-app (PR #326)** : migration 030 bucket privé `support_screenshots` + 5 RLS `storage.objects` + `SupportTicketModal` (focus-trap + Escape, form 3 champs, disclaimer PII, trigger Sidebar « Aide & feedback » gated `user`) + `submitTicket` (upload → URL signée 7j → insert + cleanup orphelin). **3 audits gate-zero ALL GREEN** (supabase-backend SHIP 11 tests adversariaux prod 0C/0H + ui clean + security 9.3/10), **code-review** 0 critical (2 fixes), **Context7** API Storage vérifiée. Tests **1765 → 1780 PASS** (8 composant + 7 RLS bucket empiriques PROD). CHANGELOG catch-up #319-325 (drift 29/05). Sprint 2.C reste 2 étapes (Resend → AdminPanel). Voir CHANGELOG.md / plan.md. — **Update précédent (24 May 2026 ~20h CEST) — 🧠 AI Tutor par rôle livré — Stage B1 + Stage B2** : 7 PRs mergées même jour (#287 → #293). Stage B1 (#290, THI-260) = eval matrix frontier 2025-2026 sur 10 modèles × 14 fixtures, $0.62 USD, 2 modèles 8/8 PASS (GPT-5.5 440 ms + Opus 4.7 premium). Stage B2 (#291, THI-275) = 3 system prompts FR cloisonnés par rôle + dispatcher + fallback student defense-in-depth + 17 tests + 4 fixtures injection `<role_context>` × 4 langues. `prompt-guardrail-auditor` Sonnet trouve 2 CRITICAL **fixés avant merge** (ghost block + DELIMITER_RX gap). 2 nouveaux agents : `legal-compliance-auditor` Opus 4.7 (THI-270 #288) + `user-forensics-auditor` Sonnet (THI-274 #293). Tests 1697 PASS (+57). Sprint 2.B prochaine session : `institution_admin` lite + `institution-rbac-auditor` gate-zero. Voir CHANGELOG.md / STORY.md pour la narrative complète. — **Update précédent (19 May 2026 ~21h CEST) — 🚀 Sprint 2.A Teacher workflow 75% shipped (étapes 1+2+2.bis+2.ter live)** : 5 PRs mergées journée (#267 `.env.example` exhaustif + #268 Teacher Dashboard CRUD `/app/teacher` + migrations 020/021 + #269 role-aware nav hub + login redirect safe + #270 adaptive default route per role super_admin → `/app/admin` + #271 docs CHANGELOG). Tests 1545 → 1604 (+59). Cascade ALL GREEN : security-auditor 9.4-9.5/10 · ui-auditor SHIP-READY · rbac-flow-tester 11/11 E2E PASS · happy path RPC empirique · Voie A Chrome MCP · Sourcery PASS. 6 follow-ups Linear créés (THI-237/238/239/240/241/242). Next : Sprint 2.A étape 3 = page `/app/join` consommant `join_class_by_code` RPC (pré-requis : agent `classroom-workflow-auditor` + THI-239 Vitest regression net + Voie A multi-personas). Voir CHANGELOG.md pour détails. — **Update précédent (16 May ~14h30 CEST) — 🚀 Sprint 2 étape 2/N — THI-153 ✅** : PR [#234](https://github.com/thierryvm/TerminalLearning/pull/234) mergée — cleanup UI bundle (umbrella audit). 4 items cherry-picked : `--github-red` CSS var unique source + migration AI/auth red palettes · UserMenu logout focus ring rouge → emerald · shadcn dead slots documentés · `sonner` désinstallé · **bonus brand fix** « Terminal Master » → « Terminal Learning » dans Layout mobile (`/app`). Sourcery review addressed (DestructiveActionButton helper local + emerald token rationale). 3 tickets backlog créés : THI-177 (pré-i18n discipline gate Phase 9 admin) · THI-178 (SEO longue traîne SSG Phase 10+) · THI-179 (securityheaders A+ COEP post-LTI 7c). Validation ui-auditor SHIP-READY · 1386 tests passed 0 errors · Landing chunk 7.33 kB gzip stable. Sprint 2 ordre verrouillé : THI-118 ✅ → THI-153 ✅ → **THI-131 Phase 7c LTI (next)** → THI-42 → THI-77/78. — **Update précédent (16 May ~10h45 CEST) — Sprint 2 démarré — deadline 10 juin — THI-118 ✅** : landing LCP regression fix mergée (PR [#232](https://github.com/thierryvm/TerminalLearning/pull/232)). Diagnostic Chrome DevTools MCP : LCP element = hero `<p>` sous-titre (texte), 98.9 % render delay, fuites `landingContent.ts` (`.reduce()` sur `commandCatalogue` forçait chunk curriculum eager) + `UserMenu`/`LoginModal`/`PWAInstallModal` eager. Fix : hardcoder + drift guard test + `React.lazy` modals. **Bundle Landing 27.29 → 7.33 kB gzip (−73 %)**, curriculum chunk plus dans le graph landing. Le test drift a caught un `TOTAL_LESSONS` 64 → 65 silencieux. Sprint 2 ordre verrouillé : THI-118 ✅ → THI-153 cleanup UI bundle (~75 min) → THI-131 Phase 7c LTI → THI-42 Profile Hub → THI-77/78 admin heatmaps. — **Update précédent (16 May ~10h CEST) — Sprint 1 Phase 7b lockdown CLOS à 4/4** : THI-148 (V1.0.1 méta-plateforme) ✅ → THI-144 (v1.1.0 anti-frictions + ADR-008) ✅ → THI-112 (onboarding AiKeySetup + AiConsentModal + AiSettings + Privacy section + M3-AI fix) ✅ → **THI-113 (audit final triple + H1 fix sentry-tunnel scrubber symétrique)** ✅. Score IA security : 8.7/10 (baseline 10 mai matin) → 9.0 → 9.1 → 9.3 → **9.4/10** post-H1 fix. Rapport audit final dans `docs/audits/ai-tutor-v1-2026-05-16.md` — verdict ALL CLEAR (3 agents : security-auditor + prompt-guardrail-auditor + ui-auditor). Prochaine étape : Phase 7c LTI activation (gate H4-AI jsonwebtoken). Voir CHANGELOG.md / STORY.md pour la narrative complète.
> Last updated: 6 juin 2026 CEST — **🔍 Audit complet pré-pause (abonnement → 10 juin)** : security-auditor 9.4/10 0 CRITICAL · route-attack « H1 SSRF » = faux-positif vérifié (fetch hardcodé) → `api/*` non touché · content-auditor 2 défauts UX moteur non-bloquants · mobile-responsive (**THI-342**) · Sentry prod clean · e2e cœur OK. **PR #375 THI-342** : textarea 16px mobile (anti auto-zoom iOS) + tap-target 44px. **Différés post-réactivation** : THI-345 (suppression compte irréversible) + THI-347 volets CRUD. Token `.secrets` Vercel invalide (leak-safe). — **Update précédent (4 juin 2026 CEST)** — **🗂️ Journée 8 PRs (#368→#374)** : THI-234 widgets analytics + THI-341 nav mobile (menu avatar) + THI-344 édition display_name + THI-346 fix dropdown + THI-347 volet 3 delete tickets (migration 033 = fix THI-334 racine). — **Update précédent (2 juin 2026 CEST)** — **🗂️ Sprint 2.C étape 4 — triage signalements super_admin (THI-320, PR #364)** : section « Signalements » dans `/app/admin` (liste + filtre statut + capture re-signée au read + statut journalisé `admin_audit_log`). **Système support complet** (formulaire → stockage → email → triage). Dropdown statut : Radix Select écarté (style inline → CSP `style-src` stricte) → `<select>` natif `[color-scheme:dark]`, CSP intacte, 0 dép. Gates : security 9.5/10 · ui SHIP · mobile · code-reviewer · Voie A e2e « 2 sens » (desktop+mobile). Suite : THI-325 (visibilité user). — **Update précédent (1er juin 2026 CEST)** — **📧 Sprint 2.C étape 3 — notification email support (THI-319, PR #360)** : à la création d'un ticket, le super_admin reçoit un email (Resend). Implémenté en **route Vercel Edge** `api/support/notify.ts` (pivot vs Edge Function Supabase : clé Resend déjà en env Vercel + `api/*` déjà serverless → 0 plateforme/dépendance/secret nouveau). **Autorisation déléguée à RLS** (JWT user forwardé à PostgREST, ligne renvoyée seulement si owner/super_admin, aucun `service_role`). Anti-replay 60s + rate-limit 10/min/IP + description HTML-escaped + `no-store` + best-effort. **3 gates 0C/0H** (security 9.2/10 · route-attack ship · code-review clean) + **email réellement reçu** (Gmail MCP) + smoke prod 200. **THI-319 Done — reste l'étape 4** (section Tickets AdminPanel, THI-320). Aussi 1er juin : session fiabilité (THI-310/315/313, PRs #353-355), cohérence catalogue fermant THI-293 (THI-316, #357), filtre crawler Sentry (THI-317, #358). — **Update précédent (30 May 2026 ~14h CEST)** — **🚀 Sprint 2.C étape 2 — signalement in-app (PR #326)** : migration 030 bucket privé `support_screenshots` + 5 RLS `storage.objects` + `SupportTicketModal` (focus-trap + Escape, form 3 champs, disclaimer PII, trigger Sidebar « Aide & feedback » gated `user`) + `submitTicket` (upload → URL signée 7j → insert + cleanup orphelin). **3 audits gate-zero ALL GREEN** (supabase-backend SHIP 11 tests adversariaux prod 0C/0H + ui clean + security 9.3/10), **code-review** 0 critical (2 fixes), **Context7** API Storage vérifiée. Tests **1765 → 1780 PASS** (8 composant + 7 RLS bucket empiriques PROD). CHANGELOG catch-up #319-325 (drift 29/05). Sprint 2.C reste 2 étapes (Resend → AdminPanel). Voir CHANGELOG.md / plan.md. — **Update précédent (24 May 2026 ~20h CEST) — 🧠 AI Tutor par rôle livré — Stage B1 + Stage B2** : 7 PRs mergées même jour (#287 → #293). Stage B1 (#290, THI-260) = eval matrix frontier 2025-2026 sur 10 modèles × 14 fixtures, $0.62 USD, 2 modèles 8/8 PASS (GPT-5.5 440 ms + Opus 4.7 premium). Stage B2 (#291, THI-275) = 3 system prompts FR cloisonnés par rôle + dispatcher + fallback student defense-in-depth + 17 tests + 4 fixtures injection `<role_context>` × 4 langues. `prompt-guardrail-auditor` Sonnet trouve 2 CRITICAL **fixés avant merge** (ghost block + DELIMITER_RX gap). 2 nouveaux agents : `legal-compliance-auditor` Opus 4.7 (THI-270 #288) + `user-forensics-auditor` Sonnet (THI-274 #293). Tests 1697 PASS (+57). Sprint 2.B prochaine session : `institution_admin` lite + `institution-rbac-auditor` gate-zero. Voir CHANGELOG.md / STORY.md pour la narrative complète. — **Update précédent (19 May 2026 ~21h CEST) — 🚀 Sprint 2.A Teacher workflow 75% shipped (étapes 1+2+2.bis+2.ter live)** : 5 PRs mergées journée (#267 `.env.example` exhaustif + #268 Teacher Dashboard CRUD `/app/teacher` + migrations 020/021 + #269 role-aware nav hub + login redirect safe + #270 adaptive default route per role super_admin → `/app/admin` + #271 docs CHANGELOG). Tests 1545 → 1604 (+59). Cascade ALL GREEN : security-auditor 9.4-9.5/10 · ui-auditor SHIP-READY · rbac-flow-tester 11/11 E2E PASS · happy path RPC empirique · Voie A Chrome MCP · Sourcery PASS. 6 follow-ups Linear créés (THI-237/238/239/240/241/242). Next : Sprint 2.A étape 3 = page `/app/join` consommant `join_class_by_code` RPC (pré-requis : agent `classroom-workflow-auditor` + THI-239 Vitest regression net + Voie A multi-personas). Voir CHANGELOG.md pour détails. — **Update précédent (16 May ~14h30 CEST) — 🚀 Sprint 2 étape 2/N — THI-153 ✅** : PR [#234](https://github.com/thierryvm/TerminalLearning/pull/234) mergée — cleanup UI bundle (umbrella audit). 4 items cherry-picked : `--github-red` CSS var unique source + migration AI/auth red palettes · UserMenu logout focus ring rouge → emerald · shadcn dead slots documentés · `sonner` désinstallé · **bonus brand fix** « Terminal Master » → « Terminal Learning » dans Layout mobile (`/app`). Sourcery review addressed (DestructiveActionButton helper local + emerald token rationale). 3 tickets backlog créés : THI-177 (pré-i18n discipline gate Phase 9 admin) · THI-178 (SEO longue traîne SSG Phase 10+) · THI-179 (securityheaders A+ COEP post-LTI 7c). Validation ui-auditor SHIP-READY · 1386 tests passed 0 errors · Landing chunk 7.33 kB gzip stable. Sprint 2 ordre verrouillé : THI-118 ✅ → THI-153 ✅ → **THI-131 Phase 7c LTI (next)** → THI-42 → THI-77/78. — **Update précédent (16 May ~10h45 CEST) — Sprint 2 démarré — deadline 10 juin — THI-118 ✅** : landing LCP regression fix mergée (PR [#232](https://github.com/thierryvm/TerminalLearning/pull/232)). Diagnostic Chrome DevTools MCP : LCP element = hero `<p>` sous-titre (texte), 98.9 % render delay, fuites `landingContent.ts` (`.reduce()` sur `commandCatalogue` forçait chunk curriculum eager) + `UserMenu`/`LoginModal`/`PWAInstallModal` eager. Fix : hardcoder + drift guard test + `React.lazy` modals. **Bundle Landing 27.29 → 7.33 kB gzip (−73 %)**, curriculum chunk plus dans le graph landing. Le test drift a caught un `TOTAL_LESSONS` 64 → 65 silencieux. Sprint 2 ordre verrouillé : THI-118 ✅ → THI-153 cleanup UI bundle (~75 min) → THI-131 Phase 7c LTI → THI-42 Profile Hub → THI-77/78 admin heatmaps. — **Update précédent (16 May ~10h CEST) — Sprint 1 Phase 7b lockdown CLOS à 4/4** : THI-148 (V1.0.1 méta-plateforme) ✅ → THI-144 (v1.1.0 anti-frictions + ADR-008) ✅ → THI-112 (onboarding AiKeySetup + AiConsentModal + AiSettings + Privacy section + M3-AI fix) ✅ → **THI-113 (audit final triple + H1 fix sentry-tunnel scrubber symétrique)** ✅. Score IA security : 8.7/10 (baseline 10 mai matin) → 9.0 → 9.1 → 9.3 → **9.4/10** post-H1 fix. Rapport audit final dans `docs/audits/ai-tutor-v1-2026-05-16.md` — verdict ALL CLEAR (3 agents : security-auditor + prompt-guardrail-auditor + ui-auditor). Prochaine étape : Phase 7c LTI activation (gate H4-AI jsonwebtoken). Voir CHANGELOG.md / STORY.md pour la narrative complète.
> This directory contains active project documentation. For historical/stale docs, see `.archive/`.

---
Expand Down
Loading
Loading