diff --git a/CHANGELOG.md b/CHANGELOG.md index aa87404..a697e33 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,21 @@ --- +## đŸ—ș 26 septembre 2026 — La roadmap publique dit ce qui existe vraiment + +*Page d'accueil · `llms.txt` · `docs/ROADMAP.md`* + +Thierry a demandĂ© de vĂ©rifier la roadmap affichĂ©e sur la page d'accueil. Chaque ligne a Ă©tĂ© comparĂ©e au code, et plusieurs promettaient plus que ce qui existe. + +- **LTI 1.3 Ă©tait annoncĂ© comme disponible.** Le code n'est qu'une maquette technique, dĂ©sactivĂ©e en production. L'intĂ©gration aux plateformes d'Ă©cole (Moodle, Canvas
) passe dans « Plus tard ». +- **OpenAI Ă©tait annoncĂ© comme fournisseur du tuteur IA.** L'API d'OpenAI refuse les appels venant d'un navigateur, et l'application le signale dĂ©jĂ  Ă  l'Ă©lĂšve. La roadmap et les fichiers lus par les moteurs IA (`llms.txt`) citent maintenant OpenRouter, Anthropic et Gemini, et prĂ©cisent qu'OpenRouter donne accĂšs aux modĂšles d'OpenAI. +- **« WCAG 2.2 AAA » surestimait l'accessibilitĂ©.** Seules les cibles tactiles visent ce niveau. La ligne cite dĂ©sormais ce qui est rĂ©ellement fait : cibles de 44 px, focus visible, zones sĂ»res de l'iPhone. +- **La colonne « En cours » montrait des chantiers gelĂ©s ou dĂ©jĂ  livrĂ©s.** Elle montre maintenant le vrai travail : la fidĂ©litĂ© du terminal Ă  un vrai shell, la thĂ©orie vĂ©rifiĂ©e commande par commande, et la page RĂ©fĂ©rence. +- **La FAQ lue par Google et les moteurs IA** annonçait aussi LTI « en cours de finalisation » et un tableau de bord enseignant « prĂ©vu pour juin 2026 », alors qu'il existe dĂ©jĂ . Elle plaçait enfin la base de donnĂ©es Ă  Francfort : elle est en Irlande (rĂ©gion eu-west-1), comme le dit la politique de confidentialitĂ©. Un test compare dĂ©sormais les deux. +- Les compteurs suivent : 2 700+ tests, 21 agents d'audit. + +--- + ## 🧭 26 septembre 2026 — Les agents de vĂ©rification remis Ă  jour, et un nouvel agent qui compare le simulateur Ă  un vrai shell *21 agents (13 Opus, 8 Sonnet) · nouvel agent `terminal-fidelity-auditor` · nouvelle commande `npm run theory:gaps`* diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index f1c3619..e7de04d 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -1,6 +1,8 @@ # Roadmap — Terminal Learning -> **Last updated:** 24 September 2026 CEST — đŸ©ș **Full check-up (resumed)**: P0 shipped — #383 dependencies (react-router 7.18.4, npm audit 41 → 24, 0 critical) + #384 THI-340 (age proof stamped on every OAuth return path). P1 terminal fidelity (THI-353) in progress — #385 per-lesson starting state, #386 monospace ligatures off (checked on a real iPhone, THI-354), #387 scripts / `$PROFILE` / ExecutionPolicy / `chmod`: exercises validating despite an error **44 → 3**. Next: redirections (`2>`, `>`, `tee`), theory ↔ terminal gaps, then the "no validation on error" guard. +> **Last updated:** 26 September 2026 CEST — đŸ©ș **Full check-up (P1 terminal fidelity, THI-353)**: #389 a real shell layer (`;` `&&` `||`, pipelines, every redirection) — **198/198 exercises validate with no red line**; #390 output matches a real shell (`pwd`, `cd -`, `ls` in a pipe, `wc`, `apt`); #391 permanent replay of every lesson's theory (754 commands); #392 `cp`/`mv` into a directory (a `mv file .` wiped the home directory) and native Windows paths in PowerShell — theory gaps **174 → 162**, bash shown on Windows **39 → 37**; #393 audit agents refreshed (13 Opus / 8 Sonnet) + new `terminal-fidelity-auditor` (simulator vs real bash / PowerShell). Public landing roadmap corrected (LTI is a disabled spike, OpenAI BYOK blocked by CORS). Next: PowerShell error messages, `/app/reference` pedagogy, remaining theory gaps (Git history, `gh`, jobs). +> +> **Previous update (24 September 2026 CEST)**: đŸ©ș **Full check-up (resumed)**: P0 shipped — #383 dependencies (react-router 7.18.4, npm audit 41 → 24, 0 critical) + #384 THI-340 (age proof stamped on every OAuth return path). P1 terminal fidelity (THI-353) in progress — #385 per-lesson starting state, #386 monospace ligatures off (checked on a real iPhone, THI-354), #387 scripts / `$PROFILE` / ExecutionPolicy / `chmod`: exercises validating despite an error **44 → 3**. Next: redirections (`2>`, `>`, `tee`), theory ↔ terminal gaps, then the "no validation on error" guard. > > **Previous update (6 June 2026 CEST)**: full pre-pause audit (security-auditor 9.4/10, 0 CRITICAL) — see CHANGELOG. > diff --git a/docs/plan.md b/docs/plan.md index 5b12484..aea3e93 100644 --- a/docs/plan.md +++ b/docs/plan.md @@ -1,6 +1,7 @@ # Terminal Learning — Plan de lancement public -> DerniĂšre mise Ă  jour : **24 septembre 2026 CEST** — **đŸ©ș Grand Check-up (reprise)** : P0 livrĂ© — #383 dĂ©pendances (react-router 7.18.4, npm audit 41 → 24, 0 critique) + #384 THI-340 (preuve d'Ăąge posĂ©e sur tous les retours OAuth). P1 « fidĂ©litĂ© du terminal » (THI-353) en cours — #385 Ă©tat de dĂ©part par leçon, #386 ligatures monospace (vĂ©rifiĂ© sur iPhone, THI-354), #387 scripts / `$PROFILE` / ExecutionPolicy / `chmod` : exercices validĂ©s malgrĂ© une erreur **44 → 3**. Suite : redirections (`2>`, `>`, `tee`), Ă©carts thĂ©orie ↔ terminal, puis garde « pas de validation si erreur ». PrĂ©cĂ©dent : 6 juin 2026 — audit complet prĂ©-pause (voir CHANGELOG). +> DerniĂšre mise Ă  jour : **26 septembre 2026 CEST** — **đŸ©ș Grand Check-up, P1 « fidĂ©litĂ© du terminal » (THI-353)** : #389 vraie couche shell (**198/198 exercices sans ligne rouge**) · #390 sorties d'un vrai shell · #391 rejeu permanent de la thĂ©orie · #392 `cp`/`mv` vers un dossier + chemins Windows natifs (Ă©carts thĂ©orie **174 → 162**) · #393 agents d'audit remis Ă  jour + `terminal-fidelity-auditor` · roadmap publique corrigĂ©e. Suite : messages d'erreur PowerShell, page RĂ©fĂ©rence, Ă©carts restants. +> PrĂ©cĂ©dent (24 septembre 2026) : P0 livrĂ© — #383 dĂ©pendances (react-router 7.18.4, npm audit 41 → 24, 0 critique) + #384 THI-340 (preuve d'Ăąge posĂ©e sur tous les retours OAuth). P1 « fidĂ©litĂ© du terminal » (THI-353) en cours — #385 Ă©tat de dĂ©part par leçon, #386 ligatures monospace (vĂ©rifiĂ© sur iPhone, THI-354), #387 scripts / `$PROFILE` / ExecutionPolicy / `chmod` : exercices validĂ©s malgrĂ© une erreur **44 → 3**. Suite : redirections (`2>`, `>`, `tee`), Ă©carts thĂ©orie ↔ terminal, puis garde « pas de validation si erreur ». PrĂ©cĂ©dent : 6 juin 2026 — audit complet prĂ©-pause (voir CHANGELOG). > Statut global : **Phase 5 EN COURS** — Curriculum Expansion : 11 modules ✅, 66 leçons, **2500+ tests unitaires** + 176 E2E — **Vision consolidĂ©e** : LTI-first (ADR-001), BYOK OpenRouter 4-tiers (ADR-002), TTFR KPI central (ADR-003), Classroom Composer UI (ADR-004), AI Tutor V1 dĂ©cisions gelĂ©es (ADR-005 — stockage, rate-limit, guardrails), Solo-sustainable practices (ADR-006), tuteur IA socratique dĂšs A1, i18n FR/NL/EN — Architecture stratĂ©gique prĂ©cĂ©dente (THI-35) : Terminal Sentinel (Phase 5.5) ✅, RBAC complet (Phase 7) ✅, Admin Panel (Phase 9), PWA avancĂ©e (Phase finale) — **Epic Web 2026 Compliance** (THI-96) : 6/8 sub-issues livrĂ©es (THI-97 → THI-102), reste Desktop a11y + CSS moderne 2026 — **Phase 7b (AI Tutor V1) ✅ COMPLETE + V1.5 SÉQUENCÉE** : THI-115 ✅, THI-109 ✅ (gate-zero guardrail), THI-110 ✅ (keyManager AES-GCM), THI-120 ✅ (Sentry scrubber), **THI-111 ✅ COEUR FONCTIONNEL** (PR #188 — sanitizer + 4 providers + panel + 287 AI tests, audits guardrail 9.4/10 + security 8.8/10 + ui A11y exemplary), **THI-147 ✅ FIX SAFE-AREA iPhone PWA** (PR #189), **panel actif en Production** (`VITE_AI_TUTOR_ENABLED=true` + `VITE_AI_TUTOR_OPENROUTER_MODEL=anthropic/claude-haiku-4-5` activĂ©s Production+Preview par @cowork) — **Sprint sĂ©curitĂ© 1-2 mai 2026 ✅ CLOS** : audit security-auditor 8.1/10 → ~8.6/10 post-sprint, 11 PRs livrĂ©es (#168 Ă  #178), 5 HIGH/MEDIUM Done (THI-133/134/135/137/140), 4 MEDIUM ciblĂ©s en backlog (THI-136/138/139/112), agent `route-attack-auditor` créé — **Session 4 mai 2026** : THI-111 livrĂ© + THI-147 livrĂ© + 5 tickets V1.5 backlog créés (THI-142 lessonContext renforcĂ© HIGH, THI-143 frustration heuristic + dĂ©tection sĂ©mantique user MEDIUM, THI-144 system prompt v1.1.0 + ADR-008 + eval suite MEDIUM, THI-145 chat assistant role-based Phase 9+ LOW, THI-146 modĂšle dĂ©faut Haiku HIGH dĂ©jĂ  actif via env var, THI-148 extend tutor scope platform meta-questions V1.0.1 P1 1h30 estimĂ©) — **Posture validĂ©e** : pas de rush deadline, qualitĂ©/scalabilitĂ©/perf non nĂ©gociables, plan respectĂ© en ordre, **mea culpa explicite** Ă  chaque round trio @thierry / @cc-terminallearning / @cowork (estimation 30 min → 1h30, privacy `userProgress` retirĂ©e V1.0.1, hypothĂšse `transform` mobile rĂ©futĂ©e par diagnostic Chrome DevTools MCP) — **Verdict empirique Haiku 4.5 (capturĂ© 4 mai 21h par @cowork via Chrome MCP)** : 5 tests qualitatifs, score moyen **9.3/10** — Test 1 mĂ©ta-plateforme 8/10, Test 2 fichiers cachĂ©s 9/10, Test 3 hallucination 9.5/10, Test 4 frustration 10/10 (Haiku bascule mode direct AUTONOMEMENT), Test 5 jailbreak 10/10. **Reprio backlog tranchĂ©e @cowork** : THI-146 ✅ SUCCÈS validĂ©, **THI-142 → Low** (Haiku gĂšre dĂ©jĂ  bien le contexte leçon), **THI-143 → Low** (Haiku rĂ©sout naturellement la frustration via comprĂ©hension contextuelle), **THI-148 P1 INCHANGÉ** (scope ≠ modĂšle prouvĂ© Test 1, GO IMMÉDIAT), THI-144 P2 Medium (peut englober THI-148 + eval suite), THI-145 P3 Low (Phase 9+). **ROI mĂ©thode scientifique** : ~4-6h Ă©conomisĂ©es (THI-142/143 reportĂ©s V2). **Next ordonnĂ© — dĂ©cision @cowork 5 mai matin** : (1) **THI-150 EN COURS** (12ᔉ agent `mobile-responsive-auditor`, ex-brick 3a de THI-149 epic Done, 11 sections / ≄48 checkpoints + bonus Section 11 Desktop Preservation + checkpoints BUG-FAB-001 visibility/contrast/detachment), (2) THI-151 audit Playwright WebKit + matrice bugs (ex-brick 3b), (3) THI-152 mini-PRs fix sĂ©quentielles (ex-brick 3c, critĂšre ABSOLU **ne pas casser desktop**), (4) THI-148 extend tutor scope mĂ©ta-plateforme V1.0.1 (1h30 honnĂȘte, scope statique platformContext, bump v1.0.0→v1.0.1, audit guardrail RĂšgle 10 obligatoire), (5) **THI-144 enrichi P1** system prompt v1.1.0 + ADR-008 + eval suite (intĂšgre 5 micro-frictions identifiĂ©es par cross-validation ChatGPT sur session 8 tours @thierry — compound questions, sur-explication internal mechanics, indices rĂ©pĂ©tĂ©s, platformContext absent confirme THI-148, conclusion ouverte), (6) THI-112 onboarding AiKeySetup + picker modĂšle curated, (7) THI-114 Web Worker isolation, (8) THI-145 chat role-based Phase 9+. **THI-142/143 reportĂ©s V2** (Haiku 9.3/10 rĂ©sout 80% naturellement). --- diff --git a/index.html b/index.html index 6cb668f..3d31464 100644 --- a/index.html +++ b/index.html @@ -240,7 +240,7 @@ "name": "Terminal Learning est-il adaptĂ© aux enseignants et aux Ă©tablissements scolaires ?", "acceptedAnswer": { "@type": "Answer", - "text": "Oui. Terminal Learning est conçu pour ĂȘtre utilisable en classe : ressource gratuite, sans inscription obligatoire pour les Ă©lĂšves, progression locale par navigateur, contenu pĂ©dagogique structurĂ© niveau A1 Ă  C1 (CEFR informatique). L'intĂ©gration LTI 1.3 est en cours de finalisation pour Moodle, Smartschool et les LMS standards (Phase 7c). Un Admin Panel pour le suivi enseignant est prĂ©vu pour juin 2026." + "text": "Oui. Terminal Learning est conçu pour ĂȘtre utilisable en classe : ressource gratuite, sans inscription obligatoire pour les Ă©lĂšves, progression locale par navigateur, contenu pĂ©dagogique structurĂ© niveau A1 Ă  C1 (CEFR informatique). Un enseignant peut crĂ©er une classe, partager un code d'invitation et suivre la progression de ses Ă©lĂšves ; un Ă©tablissement peut regrouper plusieurs enseignants. L'intĂ©gration aux plateformes d'Ă©cole (LTI 1.3 : Moodle, Canvas
) est prĂ©vue pour plus tard." } }, { @@ -248,7 +248,7 @@ "name": "Les donnĂ©es des utilisateurs sont-elles protĂ©gĂ©es (RGPD) ?", "acceptedAnswer": { "@type": "Answer", - "text": "Oui. Terminal Learning respecte le RGPD europĂ©en. Aucune donnĂ©e personnelle n'est collectĂ©e par dĂ©faut — la progression est stockĂ©e localement dans votre navigateur. Si vous crĂ©ez un compte (optionnel), seul votre email et un identifiant sont stockĂ©s sur Supabase EU-west-1 (Frankfurt). Aucun tracking publicitaire, aucun cookie tiers, aucune revente de donnĂ©es. DĂ©tails complets dans notre politique de confidentialitĂ©." + "text": "Oui. Terminal Learning respecte le RGPD europĂ©en. Aucune donnĂ©e personnelle n'est collectĂ©e par dĂ©faut — la progression est stockĂ©e localement dans votre navigateur. Si vous crĂ©ez un compte (optionnel), votre compte et votre progression sont stockĂ©s chez Supabase, dans l'Union europĂ©enne (rĂ©gion eu-west-1, Irlande). Aucun tracking publicitaire, aucun cookie tiers, aucune revente de donnĂ©es. DĂ©tails complets dans notre politique de confidentialitĂ©." } }, { diff --git a/public/llms-full.txt b/public/llms-full.txt index 9699ade..9ca9f2f 100644 --- a/public/llms-full.txt +++ b/public/llms-full.txt @@ -219,7 +219,7 @@ All role-based queries are enforced by **Supabase Row Level Security (RLS)** pol An optional, opt-in conversational tutor available on lesson pages, the dashboard, and the command reference. Designed to help when the learner is stuck without giving away the answer. -- **BYOK only**: users supply their own API key for one of the supported providers — **OpenRouter**, **Anthropic**, **OpenAI**, or **Google Gemini**. No key is ever stored or proxied through any Terminal Learning server. There is no shared backend cost and no rate-limiting beyond what the upstream provider applies to the user's key. +- **BYOK only**: users supply their own API key for one of the supported providers — **OpenRouter**, **Anthropic** or **Google Gemini**. OpenAI models are reached through OpenRouter, because OpenAI's API refuses direct browser calls (CORS). No key is ever stored or proxied through any Terminal Learning server. There is no shared backend cost and no rate-limiting beyond what the upstream provider applies to the user's key. - **Client-side storage**: keys are stored in **encrypted IndexedDB** (AES-GCM via the Web Crypto API, PBKDF2 key derivation) or, if the user prefers ephemerality, in session-scoped localStorage. The user can revoke and forget the key at any moment from the tutor settings page. - **Lesson-grounded context**: the model is told which lesson the learner is on, what command(s) the lesson covers, and what target environment (Linux/macOS/Windows) is active. - **Defense in depth against prompt injection**: input sanitizer (heuristic + length cap), system prompt v1.1.0 with XML-delimited untrusted blocks, post-filter on model output, audited by a dedicated `prompt-guardrail-auditor` agent before every release. @@ -235,7 +235,7 @@ An optional, opt-in conversational tutor available on lesson pages, the dashboar - **Progress tracking**: localStorage (no account) + Supabase PostgreSQL (optional cloud sync) - **Auth**: Supabase Auth — GitHub OAuth + Google OAuth + email/password - **Access control**: Role-Based Access Control (RBAC) with 5 roles — student, teacher, pending_teacher, institution_admin, super_admin — enforced by Supabase Row Level Security (RLS) policies -- **AI tutor (optional)**: BYOK (Bring Your Own Key) — client-side only, supports OpenRouter / Anthropic / OpenAI / Google Gemini. Keys are encrypted in IndexedDB (AES-GCM via WebCrypto) or stored session-scoped in localStorage. Streaming via Server-Sent Events. Input/output sanitizers + post-filter for prompt injection defense +- **AI tutor (optional)**: BYOK (Bring Your Own Key) — client-side only, supports OpenRouter / Anthropic / Google Gemini (OpenAI models via OpenRouter). Keys are encrypted in IndexedDB (AES-GCM via WebCrypto) or stored session-scoped in localStorage. Streaming via Server-Sent Events. Input/output sanitizers + post-filter for prompt injection defense - **Hosting**: Vercel (EU region, GDPR compliant) — HSTS preload, Content Security Policy, automatic DDoS mitigation - **Tests**: Vitest unit + integration tests + Playwright E2E suites (accessibility, mobile, SEO) @@ -259,7 +259,7 @@ Yes. The app is fully responsive and works on phones and tablets. Yes, optionally. Sign in with GitHub or Google to sync progress across devices. Fully GDPR compliant. **Is there an AI tutor?** -Yes, optional and BYOK (Bring Your Own Key). Bring your own OpenRouter, Anthropic, OpenAI, or Google Gemini API key — it stays on your device (encrypted IndexedDB or session-scoped localStorage) and never transits any Terminal Learning server. The tutor is grounded in the current lesson context and refuses requests that try to bypass that scope. +Yes, optional and BYOK (Bring Your Own Key). Bring your own OpenRouter, Anthropic or Google Gemini API key (OpenAI models are available through OpenRouter) — it stays on your device (encrypted IndexedDB or session-scoped localStorage) and never transits any Terminal Learning server. The tutor is grounded in the current lesson context and refuses requests that try to bypass that scope. **Can teachers create classrooms?** Yes. Approved teachers can create classes, share an invitation code, list enrolled students, and monitor per-student progress. Institutions can group multiple teachers and classes under an institution administrator. Cross-institution data is blocked at the database layer (Row Level Security). diff --git a/public/llms.txt b/public/llms.txt index eb60206..45ae4e1 100644 --- a/public/llms.txt +++ b/public/llms.txt @@ -124,7 +124,7 @@ Every lesson covers **Linux**, **macOS**, and **Windows** (PowerShell) with envi - No account required to start — progress saved in localStorage - Optional cloud sync via GitHub or Google OAuth (Supabase Auth) - Multi-role classroom (RBAC): students, teachers (class management + invitation codes), institution administrators, super admin — Row Level Security enforced at the database layer -- Optional AI tutor (BYOK — Bring Your Own Key): contextual help on the current lesson via OpenRouter, Anthropic, OpenAI, or Google Gemini. Keys are stored client-side only (encrypted IndexedDB or session-scoped localStorage), never relayed through any Terminal Learning server +- Optional AI tutor (BYOK — Bring Your Own Key): contextual help on the current lesson via OpenRouter, Anthropic or Google Gemini (OpenAI models through OpenRouter: OpenAI's API refuses direct browser calls). Keys are stored client-side only (encrypted IndexedDB or session-scoped localStorage), never relayed through any Terminal Learning server - GDPR/RGPD compliant, hosted on Vercel (EU region) - Fully open source — contributions welcome diff --git a/src/app/data/landingContent.ts b/src/app/data/landingContent.ts index 9d46fe6..a7866de 100644 --- a/src/app/data/landingContent.ts +++ b/src/app/data/landingContent.ts @@ -79,7 +79,7 @@ export const ROADMAP_AVAILABLE: readonly RoadmapGroup[] = [ group: 'Curriculum', items: [ '11 modules progressifs (navigation → IA pour dev)', - 'Terminal interactif avec validation', + 'Terminal interactif : pipes, redirections, scripts', `RĂ©fĂ©rence enrichie (${TOTAL_COMMANDS}+ commandes)`, 'Parcours guidĂ© par niveaux + Dashboard de progression', ], @@ -88,6 +88,7 @@ export const ROADMAP_AVAILABLE: readonly RoadmapGroup[] = [ group: 'Multi-OS', items: [ 'Linux / macOS / Windows — sĂ©lection + adaptation par OS', + 'Chemins Windows natifs dans PowerShell (\\, C:\\Users)', 'Partage natif (Web Share API)', ], }, @@ -95,7 +96,7 @@ export const ROADMAP_AVAILABLE: readonly RoadmapGroup[] = [ group: 'Tuteur IA', items: [ 'Multi-rĂŽles cloisonnĂ©s (Ă©lĂšve / enseignant / institution / super-admin)', - '4 providers BYOK (OpenRouter / Anthropic / OpenAI / Gemini)', + 'Ta propre clĂ© (BYOK) : OpenRouter, Anthropic, Gemini', 'Onboarding clĂ© chiffrĂ©e (AES-GCM opt-in) + consent RGPD', 'Audit IA security 9.2/10 (24 mai 2026)', ], @@ -105,42 +106,36 @@ export const ROADMAP_AVAILABLE: readonly RoadmapGroup[] = [ items: [ 'Espace enseignant — classes, code invitation, dashboard Ă©lĂšves', 'Espace institution_admin — approbation enseignants + isolation cross-institution', - 'Panel super-admin + 20 agents Claude Code spĂ©cialisĂ©s', - 'LTI 1.3 Phase 7c — JWK validation + replay protection', + 'Panel super-admin — santĂ© de la base, activitĂ©, signalements', + 'Signalement de bug intĂ©grĂ© (capture d\'Ă©cran incluse)', ], }, { group: 'QualitĂ©', items: [ - 'AccessibilitĂ© WCAG 2.2 AAA (safe-area iOS, focus-visible)', + 'AccessibilitĂ© WCAG 2.2 (cibles tactiles 44 px, focus visible, safe-area iOS)', 'SĂ©curitĂ© durcie (CSP SHA-256, rate limiting, endpoints gated)', - 'Sauvegarde locale + cloud (optionnel)', + 'Âge minimum vĂ©rifiĂ© Ă  l\'inscription (RGPD mineurs)', + 'Chaque changement vĂ©rifiĂ© : 2 700+ tests + 21 agents d\'audit', ], }, ]; export const ROADMAP_IN_PROGRESS: readonly RoadmapGroup[] = [ { - group: 'Tuteur IA V1.5', + group: 'Grand check-up qualitĂ©', items: [ - 'Stage B3 — picker UI modĂšle filtrĂ© par rĂŽle', - 'Stage B1.b — eval matrix multi-turn × 4 rĂŽles', - ], - }, - { - group: 'Plateforme B2B', - items: [ - 'Phase 9 Admin Panel — widgets gratuits (GitHub + Vercel + Supabase + Sentry)', - 'Sprint 2.C — workflow rejection enseignants + statistiques institution', - 'SEO/GEO/AEO — Schema.org + landing NL + DPA template Ă©coles', + 'Terminal fidĂšle Ă  un vrai shell (bash et PowerShell)', + 'Chaque exemple de leçon identique Ă  ce que le terminal affiche', + 'Messages d\'erreur PowerShell rĂ©alistes', ], }, { group: 'Curriculum', items: [ - 'Extension nouveaux modules & exercices', - 'Plus d\'exercices pratiques & quiz par section', - 'Guide d\'installation PWA (iOS / Android / Desktop)', + 'Page RĂ©fĂ©rence plus pĂ©dagogique pour les dĂ©butants', + 'Une variante PowerShell pour chaque leçon', + 'Historique Git rĂ©aliste dans les leçons avancĂ©es', ], }, ]; @@ -159,14 +154,15 @@ export const ROADMAP_PLANNED: readonly RoadmapGroup[] = [ 'Mode histoire narratif', 'Badges & Open Badges 3.0 (CEFR + EQF)', 'RĂ©visions intelligentes', + 'Guide d\'installation PWA (iOS / Android / Desktop)', ], }, { - group: 'Architecture & V2', + group: 'Écoles & tuteur IA', items: [ - 'Web Worker isolation tuteur IA (V1.5, THI-114)', + 'IntĂ©gration LMS (LTI 1.3 : Moodle, Canvas
)', + 'Tuteur IA V1.5 — modĂšles filtrĂ©s par rĂŽle, isolation Web Worker', 'Parcours avancĂ©s (Docker, scripting, IA augmentĂ©e)', - 'Tuteur IA chat assistant role-based (Phase 9+)', ], }, ]; @@ -187,7 +183,7 @@ export const TRUST_BADGES = [ { icon: Github, label: '100% Open Source', href: 'https://github.com/thierryvm/TerminalLearning' }, { icon: Infinity, label: 'Free Forever', href: undefined }, { icon: Lock, label: 'GDPR Compliant', href: undefined }, - { icon: CheckCircle2, label: '1000+ tests · CI verte', href: 'https://github.com/thierryvm/TerminalLearning/actions' }, + { icon: CheckCircle2, label: '2 700+ tests · CI verte', href: 'https://github.com/thierryvm/TerminalLearning/actions' }, ] as const; // ── Module icons map ────────────────────────────────────────────────────────── diff --git a/src/test/seo.test.ts b/src/test/seo.test.ts index 61fe02d..e714e2b 100644 --- a/src/test/seo.test.ts +++ b/src/test/seo.test.ts @@ -167,6 +167,22 @@ describe('SEO -- JSON-LD structured data (Schema.org)', () => { expect(rgpdQ).toBeDefined(); }); + // The FAQ once placed the database in "EU-west-1 (Frankfurt)"; eu-west-1 is Ireland. + // The privacy policy is the reviewed source, so the FAQ must name the same region and country. + it('FAQPage RGPD answer names the same database region as the privacy policy', () => { + const policy = readFileSync(join(SRC_DIR, 'app', 'components', 'PrivacyPolicy.tsx'), 'utf-8'); + const m = policy.match(/rĂ©gion ]*>(eu-[a-z]+-\d)<\/code>, ([A-ZÀ-Ý][a-zĂ -Ăż]+)\)/); + expect(m, 'region sentence not found in PrivacyPolicy.tsx').not.toBeNull(); + const [, region, country] = m!; + const g = extractJsonLd()['@graph'] as Array>; + const faq = g.find((n) => n['@type'] === 'FAQPage'); + const entities = faq?.['mainEntity'] as Array>; + const rgpdQ = entities.find((q) => /RGPD/.test(q['name'] as string)); + const answer = (rgpdQ?.['acceptedAnswer'] as Record | undefined)?.['text'] as string; + expect(answer).toContain(region); + expect(answer).toContain(country); + }); + it('Aucune rĂ©fĂ©rence orpheline "64 leçons" (anti-drift documentaire)', () => { const html = readHtml(); expect(html).not.toContain('64 leçons');