mirror of
https://github.com/Ladebeze66/devsite.git
synced 2026-05-12 01:06:26 +02:00
26 KiB
26 KiB
Feuille de route
Dernière mise à jour : 2026-04-28
Document vivant : ajuster les statuts et dates au fil du travail.
Court terme (prochaines itérations)
| ID | Sujet | Statut | Notes |
|---|---|---|---|
| R1 | Moderniser l’UI (design system, cohérence typo/couleurs) | En cours | Direction "Digital Atelier" inspirée de stitch_V1/ ; cadrage et plan dans REFONTE-VISUELLE.md. Étapes 1-7 (tokens + garde-fou + migration typo globale + layout racine + home + listes portfolio/compétences + fiches détail & GrasBot) faites le 2026-04-22. Reste l'étape 8 (contact + footer éditorial). |
| R2 | Homogénéiser TS vs JS dans app/ |
À faire | Migrer progressivement les .jsx/.js |
| R3 | Centraliser config API (Strapi + LLM) via .env |
À faire | Remplacer URLs en dur où pertinent |
| R4 | Revoir layout.tsx (server vs client, perf SEO) |
À faire | Lié au plan 10-plan-server-components.md — extraction header/footer client possible |
| R5 | Chatbot GrasBot — retrieval local (Qwen3 + vault Obsidian) | v3 en place | Pipeline graph + BM25 (llm-api/search.py), plus de RAG vectoriel ni de dépendance ChromaDB. Vault vault-grasbot/ enrichi automatiquement (aliases/answers/priority). Lecture directe depuis build-vault.py, plus d'étape d'indexation. Doc : 08-vault-obsidian-retrieval.md. Reste : fix clean-api-data.js (homepages + glossaires), affichage sources côté front, badge grounded, historique conversationnel, streaming. |
Moyen terme
| ID | Sujet | Statut | Notes |
|---|---|---|---|
| M1 | Tests (e2e ou smoke sur routes critiques) | À faire | |
| M2 | Accessibilité (navigation, contrastes, focus) | À faire | |
| M3 | Performance (images Next/Image, bundle, SSR données) | En cours | Images + pickStrapiImage + preconnect : 09-performances-images.md. compress : maintenu à false (IIS). Prochaine étape : Server Components — plan 10-plan-server-components.md (pas d’implémentation sans go utilisateur). |
Long terme / idées
| ID | Sujet | Statut | Notes |
|---|---|---|---|
| L1 | CI/CD ou script de déploiement documenté | À faire | |
| L2 | Monitoring / logs centralisés | À faire |
Historique des jalons
| Date | Jalon |
|---|---|
| 2026-04-01 | Création du dossier docs-site-interne (dépôt Git) et première rédaction basée sur le code. |
| 2026-04-01 | Reprise après coupure : vérification complétude ; enrichissement de 04-api-llm-et-chatbot.md ; suppression de test.txt. |
| 2026-04-01 | Index captures (captures/INDEX.md), captures/README.md, 07-reference-visuelle-captures.md, skill .cursor/skills/site-portfolio-evolution/SKILL.md. |
| 2026-04-01 | Captures WebP intégrées au dépôt ; INDEX et README captures/ alignés sur les noms réels (slug portfolio / compétence documentés). |
| 2026-04-22 | Audit visuel complet (captures/AUDIT-VISUEL.md), correctifs layout (option 1 + compensation header + drawer mobile). |
| 2026-04-22 | Refonte visuelle "Digital Atelier" — étape 1 (tokens Tailwind : palette Stitch, font-headline Manrope + font-body Newsreader, rounded-sheet/tile, shadow-ambient/jewel) et étape 2 (garde-fou + plan dans REFONTE-VISUELLE.md). |
| 2026-04-22 | Refonte visuelle — étape 3 : migration typographique globale. Toutes les classes font-orbitron-* (12 définitions CSS, 29 occurrences dans 11 fichiers) remplacées par font-headline Manrope + tailles/poids Tailwind explicites. Import Google Fonts Orbitron supprimé de app/assets/main.css. |
| 2026-04-22 | Refonte visuelle — correctif post-étape 3 : régression de couleurs texte entre desktop/mobile. Retrait du @media (prefers-color-scheme: dark) hérité du template Next (incohérent avec l'arbitrage "light-only"), --foreground fixé à #191c1d (on-surface Stitch), body avec couleur non-dépendante du thème système. 3 classes Tailwind invalides text-black-500/700 remplacées par text-gray-700 (app/layout.tsx, app/page.tsx, app/components/ContentSectionCompetences.tsx). |
| 2026-04-22 | Refonte visuelle — étape 4 : layout racine. Header "No-Line" (bordure pleine supprimée, shadow-ambient-sm + backdrop-blur-vellum, titre en text-primary). Burger refait en ghost button (Material Symbols menu/close au lieu des caractères ☰/✕). Cercles animés repeints en bg-primary/40 + bg-primary-container/30. Drawer mobile en bg-primary/90 backdrop-blur-vellum + liens éditoriaux (bg-primary-container/60 → hover bg-primary-fixed text-primary). Bug préexistant corrigé : NavLink ignorait className et onClick fournis par le drawer mobile → refait avec support className / onClick / activeClassName / inactiveClassName, comportement desktop historique préservé. Compteur de visites migré de layout.tsx (bloc orphelin absolute bottom-0 right-0) vers Footer.jsx (ligne discrète text-[10px] uppercase tracking-[0.3em]). Nettoyage : state visitCount + useEffect déplacés, div.max-w-5xl vide retirée, state count inutilisé retiré de Footer.jsx. |
| 2026-04-22 | Refonte visuelle — correctif urgent ModalGlossaire (blocage mobile signalé sur Samsung S25 Ultra). w-[114vw] max-w-6xl h-[72vh] → w-full max-w-4xl max-h-[90vh] + overflow-y-auto. Fermeture ajoutée sur tap-voile et Escape. Bouton fermeture rond 40 px Material Symbol close. Alignement palette Stitch (bg-on-surface/75, bg-surface-container-lowest/95, rounded-sheet, text-primary, description font-body Newsreader). "use client" + role="dialog" aria-modal ajoutés. |
| 2026-04-22 | Refonte visuelle — étape 5 : home. Hero "feuillet de vellum" (bg-surface-container-lowest/85 backdrop-blur-vellum shadow-ambient rounded-sheet) avec grille auto_1fr portrait + texte. Portrait en frame primary (bg-primary p-1 rounded-sheet) qui remplace le cercle rounded-full border-4. Kicker Portfolio · Étudiant 42 Perpignan. Titre Manrope extrabold. cv Strapi rendu via ReactMarkdown + plugin typography (prose prose-stone custom). CTAs jewel /portfolio (primary shadow-jewel) + ghost /contact (hover bg-primary-fixed/40). Nouvelle section "Trois axes de travail" (3 cartes takeaway avec icônes Material Symbols psychology, terminal, school, contenu hardcodé dans takeaways[]). Pull-quote éditoriale border-l-4 border-primary en Newsreader italique. Double <main> supprimé (layout racine fournit déjà le <main>). |
| 2026-04-22 | Refonte visuelle — correctifs post-étape 5 (retour utilisateur). Icônes Material Symbols affichées comme texte littéral (ex. "psychology" visible dans le rond bleu des takeaways) : oubli de font-family: 'Material Symbols Outlined' dans la règle .material-symbols-outlined de app/globals.css — Google Fonts pose le @font-face mais pas la règle de classe. Fix : ajout de la ligne manquante, toutes les icônes (takeaways, burger, modale, CTAs) s'affichent désormais correctement. Pull-quote "Démarche" qui se fondait dans le wallpaper : passée en carte vellum légère (bg-surface-container-lowest/65 backdrop-blur-vellum rounded-tile, sans shadow-ambient) pour rester lisible sans écraser la variation éditoriale. Espace trop grand entre les 3 sections : gap-8 → gap-5, py-6 md:py-8 retiré sur la pull-quote (remplacé par le padding interne de sa carte). |
| 2026-04-22 | Refonte visuelle — correctifs post-étape 5 (2e passe). Icônes toujours en texte littéral après le fix font-family : URL Google Fonts @24,400,0,0 (valeur fixe) potentiellement non résolue côté navigateur. Passée en syntaxe ranges @20..48,100..700,0..1,-50..200 (alignée sur stitch_V1/code.html), fiable et documentée. Densité verticale encore trop aérée : gap-5 → gap-3 sur le container racine de la home. Paddings internes cartes resserrés : hero p-6 sm:p-8 md:p-10 → p-5 sm:p-7 md:p-8 ; takeaways p-6 sm:p-8 → p-5 sm:p-6. Grille intérieure takeaways gap-4 → gap-3. Hero texte gap-4 → gap-3. En-tête de section takeaways mb-6 → mb-4. |
| 2026-04-22 | Diagnostic critique via DevTools Network (Chrome desktop + mobile) : aucune des trois Google Fonts (Manrope, Newsreader, Material Symbols) n'était réellement chargée par le navigateur — les @import url('https://fonts.googleapis.com/...') dans app/globals.css étaient strippés par la chaîne PostCSS + Tailwind de Next 15 en production. Conséquence : tout le site tournait en fallback Arial / Georgia depuis l'étape 3, la typo éditoriale Stitch n'était jamais réellement visible. Fix phase 1 (fonts textuelles) : création de app/fonts.ts qui exporte Manrope et Newsreader via next/font/google (téléchargement au build, service depuis le domaine du site, plus de dépendance CDN externe). app/layout.tsx importe ces fonts et pose ${manrope.variable} ${newsreader.variable} sur le <html>. tailwind.config.ts : font-headline et font-body repointés vers var(--font-manrope) et var(--font-newsreader). app/globals.css : 2 @import inopérants supprimés ; l'@import Material Symbols reste temporairement en attendant la phase 2. Validation DevTools Computed : font-family: Manrope, "Manrope Fallback", system-ui, sans-serif confirmé sur le h1 de la home. |
| 2026-04-22 | Fix phase 1b : font par défaut du body dans app/globals.css passée de Arial, Helvetica, sans-serif à var(--font-newsreader), Georgia, serif. Tout élément sans classe typo explicite hérite désormais de Newsreader (corps éditorial Stitch) au lieu d'Arial. Fix phase 2 (Material Symbols) : @import url(...) Material Symbols retiré de app/globals.css (strippé), remplacé par un triplet <link rel="preconnect"> + <link rel="stylesheet"> injecté dans le <head> de app/layout.tsx — contourne le pipeline PostCSS tout en conservant le CDN Google pour la font-icon (usage très ponctuel : 5 icônes sur la home, 2 sur le burger, 1 sur la modale). Validé en production : icônes + fonts OK sur Chrome desktop. |
| 2026-04-22 | Correctif Chrome Auto-Translate mobile (retour utilisateur : layout décalé + icônes redevenues du texte littéral sur Chrome mobile quand la traduction auto s'active). Cause : les icônes Material Symbols fonctionnent via ligatures de font (<span>psychology</span> → glyphe cerveau) ; Chrome traduit le texte psychology en psychologie, la ligature ne match plus, l'icône redevient texte. Fix : translate="no" ajouté sur les 8 <span className="material-symbols-outlined"> (5 dans app/page.tsx, 2 dans app/layout.tsx, 1 dans app/components/ModalGlossaire.tsx) + sur le titre header (nom propre Portfolio Gras-Calvet Fernand). La traduction automatique reste globalement active pour le contenu éditorial (CV, compétences, projets) — seuls les éléments que la traduction casse sont protégés. |
| 2026-04-22 | Correctif séparateurs <hr> du hero (retour utilisateur : « trop d'espace entre les sections » en fait dû à des <hr> quasi invisibles générés depuis les --- Markdown du CV Strapi). Option B retenue : surcharge prose-hr sur le wrapper ReactMarkdown (app/page.tsx) pour transformer la règle en pastille Stitch centrée (prose-hr:border-0 prose-hr:w-16 prose-hr:mx-auto prose-hr:bg-primary/30 prose-hr:h-0.5 prose-hr:rounded-full prose-hr:my-6). Le séparateur redevient un signal visuel intentionnel et cohérent avec la palette, marges verticales réduites de 32 px à 24 px. Détail dans REFONTE-VISUELLE.md §4 sexies. |
| 2026-04-22 | Correctif post-étape 6 : réintroduction du défilement auto en vignette. L'arbitrage initial "carousel retiré des listes" retiré après retour utilisateur (« j'ai perdu ma fonctionnalité précédente »). Nouveau composant app/components/VignetteCarousel.tsx : Swiper allégé (modules Autoplay + Pagination uniquement), sans flèches (conflit de clic avec le <Link> englobant) et sans lightbox (réservée à la fiche détail). Pagination bullets teintée primary via surcharge inline des variables CSS Swiper (--swiper-pagination-color: #26445d) pour ne pas polluer globals.css. Autoplay 3500 ms, loop conditionnel (length > 1 pour éviter le warning Swiper sur les entrées mono-image). Intégré dans app/portfolio/page.jsx et app/competences/page.jsx via images.length > 1 ? <VignetteCarousel /> : <img statique /> — comportement identique à l'ancien pour les mono-image, défilement retrouvé pour les multi-image. Les composants Carousel.tsx et CarouselCompetences.tsx existants restent intacts pour la fiche détail (étape 7). Détail dans REFONTE-VISUELLE.md §6 "Correctif post-étape 6 — réintroduction du défilement automatique en vignette". |
| 2026-04-22 | Correctif wallpaper sur-zoomé sur pages longues (retour utilisateur post-étape 6 : incohérence visuelle entre la home et /portfolio). Cause : .bg-wallpaper en absolute inset-0 à l'intérieur du conteneur grid min-h-[100dvh] — le conteneur s'étirant à la hauteur du contenu (≈ 2-3 viewports sur les listes), background-size: cover zoomait l'image pour couvrir toute cette hauteur. Fix : wallpaper sorti du grid, passé en fixed inset-0 z-0 pointer-events-none (calé sur le viewport, plus la page entière). Les cercles animés restent en absolute dans le grid. Impact transversal sur toutes les pages longues (fiches détail à venir, etc.). Détail dans REFONTE-VISUELLE.md §6. |
| 2026-04-22 | Vault GrasBot — correctif note CV + protection source: manual effective. La note vault-grasbot/30-Parcours/cv-grascalvet-fernand.md était produite par pypdf avec des espaces entre chaque caractère (mise en page Canva du PDF source) → illisible. Réécriture manuelle en Markdown structuré à partir du contenu PDF : sections Identité / Contact / Présentation / Objectifs alternance / Expérience pro (42 → Infirmier → Ostréiculture) / Compétences (langages, IA/LLM, systèmes) / Langues / Intérêts (hardware, 3D, domotique, IA). Wikilinks vers les projets 42 et les compétences ([[libft]], [[get-next-line]], [[inception]], [[ia]], [[impression-3d]], etc.). Frontmatter passé en source: manual + domains: [parcours, ecole-42, ia, 3d, domotique]. Correctif de fond dans strapi_extraction/build-vault.py : la règle « ne pas écraser les notes source: manual » était documentée mais pas implémentée — write_notes() écrasait systématiquement. Ajout de _existing_source() qui lit le frontmatter existant + skip avec log ⏭ si source: manual. La règle est désormais effective (vérifié en --dry-run : la note CV curatée est bien préservée). |
| 2026-04-22 | Chatbot GrasBot — migration Mistral → Qwen3 + RAG sur vault Obsidian local. Passage du modèle mistral à qwen3:8b dans llm-api/api.py (Q4_K_M, ~5 Go VRAM RTX 2080 Ti). Embeddings via nomic-embed-text (~500 Mo VRAM, multilingue FR). Nouveau pipeline RAG : llm-api/rag.py (embed / retrieve / build_prompt / generate / answer), llm-api/index_vault.py (parse frontmatter YAML, chunking par h2 au-delà de 3000 chars, upsert ChromaDB batch 32), llm-api/requirements.txt (fastapi, uvicorn, requests, chromadb, pyyaml). Nouveau script strapi_extraction/build-vault.py qui convertit strapi_extraction/docs/*.md + CV PDF (via pypdf) en vault Obsidian structuré vault-grasbot/ : frontmatter YAML (type, source, domains, tags, linked, related, visibility), wikilinks vers les MOCs, MOCs auto-générés par type et par domaine (15 MOCs). Bootstrap v1 du vault : 17 projets, 4 compétences, 1 CV, 15 MOCs auto + 1 manuel (Technique), 3 notes auto-doc dans 50-Technique/ (architecture-site, grasbot-rag, vault-structure) pour que GrasBot puisse se présenter lui-même. Compatibilité ascendante askAI.js/ChatBot.js via le champ response conservé ; les sources, rag, model ajoutés sont non destructifs. Endpoint /health ajouté pour debug. Doc : nouveau 08-vault-obsidian-rag.md, mise à jour de 04-api-llm-et-chatbot.md et 06-strapi-extraction.md. Fragilités préexistantes repérées (cleaner homepages absent, content-type glossaire non extrait) consignées mais non corrigées dans ce lot — à traiter lors du prochain enrichissement vault. |
| 2026-04-22 | Refonte visuelle — étape 7 : fiches détail + glossaire + GrasBot flottant. Cinq sous-lots. 7.a : Carousel.tsx + CarouselCompetences.tsx harmonisés (pagination bullets primary via variables CSS Swiper, flèches primary, rounded-tile shadow-ambient-sm, autoplay 3500 ms + loop conditionnel, lightbox Stitch refaite avec voile bg-on-surface/80, image object-contain rounded-sheet, bouton close rond Material Symbol + Escape + verrouillage scroll body). 7.b : ContentSection.tsx (fiche portfolio) — gabarit vellum cohérent avec la home/listes, pastille retour arrow_back, kicker Projet · Portfolio, titre Manrope, carousel détail plein cadre, corps Markdown en prose Stitch (mêmes overrides que la home, y compris pastille prose-hr), CTA externe jewel avec open_in_new, états loading/404 en vellum. 7.c : ContentSectionCompetences.tsx + container — même gabarit. Refactor glossaire : styles inline style="color:red/blue" remplacés par les classes .glossary-keyword / .chatbot-keyword (ajoutées à globals.css, couleur primary + underline dotted offset 3 px). Event listeners document.body.addEventListener remplacés par un listener unique scopé au wrapper contentRef. Le clic sur « IA locale » ne monte plus un <ChatBot> local mais dispatch window.dispatchEvent(new CustomEvent("grasbot:open")) capté par le FAB global (7.e). Container refait avec skeleton vellum à la place de ⏳ Chargement.... 7.d : ChatBot.js entièrement restylé (carte vellum rounded-sheet shadow-ambient backdrop-blur-vellum, header primary avec Material Symbol smart_toy + sous-titre « Assistant IA locale », bulles user bg-primary text-white et bot bg-surface-container, input Stitch avec focus-visible:ring-primary, bouton envoyer rond jewel Material Symbol send, auto-scroll, focus auto, envoi Enter, disabled pendant attente, message d'accueil vide éditorial). 7.e : nouveau composant app/components/GrasBotFab.tsx — FAB jewel fixed bottom-6 right-6 z-30 rond 56/64 px, bg-primary shadow-jewel Material Symbol smart_toy/close, monté dans app/layout.tsx → chatbot accessible depuis toutes les pages (plus seulement fiches compétences). Écoute CustomEvent("grasbot:open") dispatché depuis le keyword « IA locale ». Fermeture Escape globale, panneau responsive plein largeur mobile / 384 px desktop. Détails dans REFONTE-VISUELLE.md §7. |
| 2026-04-22 | Refonte visuelle — étape 6 : listes portfolio + compétences. app/portfolio/page.jsx et app/competences/page.jsx entièrement réécrits. En-tête éditorial (kicker + titre Manrope extrabold + pitch Newsreader) cohérent avec le hero de la home. Grille asymétrique 2/3 + 1/3 alternée (md:grid-cols-6 + pattern de col-span-4/col-span-2 sur modulo 4, sm:grid-cols-2, grid-cols-1 mobile) — conforme DESIGN.md §6 "No-Grid-Lock". Cartes « feuillet vellum » alignées home : rounded-sheet bg-surface-container-lowest/85 backdrop-blur-vellum shadow-ambient, image aspect-[4/3] fixe avec group-hover:scale-[1.03], titre text-primary, description line-clamp-3 en Newsreader, CTA tertiaire « Découvrir → » / « Explorer → » avec Material Symbol arrow_forward qui se décale au hover (translate="no" appliqué). Hover : hover:-translate-y-0.5 hover:shadow-jewel (remplace le scale-105 qui débordait). Swiper retiré des vignettes de liste (arbitrage acté § 2 : carousel réservé aux galeries intra-fiche) — une seule image par carte, loading="lazy". États ajoutés : skeletons animés respectant la grille + état vide avec Material Symbol. Régressions corrigées au passage : largeur fixe w-80 qui débordait sur S25 Ultra, hover:scale-105 qui tapait sous le header, classes bg-white/80 rounded-lg remplacées par les tokens Stitch. Les composants Carousel.tsx et CarouselCompetences.tsx restent en place pour les fiches détail (étape 7). Détail dans REFONTE-VISUELLE.md §6. |
| 2026-04-23 | GrasBot — tuning pipeline LLM + anti-hallucinations. Audit des premières traces Langfuse : questions biographiques hallucinées (âge erroné, statut inventé), réponses longues tronquées. Quatre ajustements : (1) llm-api/search.py · generate() — num_ctx=8192 explicite (stoppe la troncature silencieuse du prompt par le défaut Ollama 2048/4096 quand plusieurs notes entières sont injectées), num_predict 512 → 1024 (réponses longues complètes), think: false top-level (désactive le thinking mode de qwen3 qui consommait du budget de sortie). (2) llm-api/search.py · build_prompt() — troncature conditionnelle des sources rank 2+ via _truncate_body() + nouvelles variables SEARCH_SECONDARY_MAX_CHARS (1500) / SEARCH_SECONDARY_KEEP_RATIO (0.8). Aucune source n'est supprimée, seules celles dont le score est < 0.8 × score(#1) ET dont le body dépasse 1500 chars sont résumées. Loggé dans prompt_build.metadata.truncation. (3) Vault — nouvelle note vault-grasbot/30-Parcours/bio-fernand.md courte et factuelle (priority 10, aliases biographiques courts), canonique pour les questions du type « qui est Fernand ». Renvoie vers le CV complet pour le détail. Correction incohérence d'âge dans le CV (46 → 47 ans dans la section Présentation) qui alimentait les hallucinations. (4) SYSTEM_PROMPT — nouveau bloc Règles de fidélité aux sources : priorité type=parcours pour questions bio, interdiction d'inventer des faits factuels, gestion explicite des contradictions, signalement des notes tronquées. Bascule Langfuse v4 → v3 dans requirements.txt (langfuse>=3.0,<4) : le SDK v4 a supprimé start_as_current_span, la v3 reste compatible avec l'instrumentation existante. Dépendances Python ajoutées : langfuse, python-dotenv. Secrets Langfuse déplacés de .env.local Next vers llm-api/.env (non committé). Doc mise à jour : langfuse-observability.md (nouvelle section Tuning du pipeline — 2026-04-23), CONFIGURATION_SITE.md (endpoints /health + /reload-vault), etat-actuel.md (42 notes + mention Langfuse). |
| 2026-04-22 | GrasBot v3 — bascule RAG vectoriel → retrieval graph + BM25. Essais d'installation Windows bloqués par chroma-hnswlib (compilation C++ requise) et freezes RDP à chaque chargement de qwen3:8b + nomic-embed-text simultanément. Arbitrage : pour un vault de 40 notes, la RAG vectorielle sur-dimensionne ; on exploite directement la structure Obsidian (frontmatter, wikilinks, MOCs). Nouveau pipeline dans llm-api/search.py (scoring multi-signaux : aliases / titre-slug / answers / domains / tags / BM25 ; expansion par graphe via linked/related/wikilinks ; tokenizer FR avec normalisations c++ → cpp, split -/_). Déterministe, traçable (champ reasons dans les sources), 50 ms de retrieval. Scoring calibré sur 12 cas (IA, push-swap, LLMs pluriel, hors-sujet clafoutis → (aucun), etc.). Dépendances allégées : fini chromadb, chroma-hnswlib, nomic-embed-text. requirements.txt = fastapi + uvicorn + requests + pyyaml uniquement. Fichiers supprimés : llm-api/rag.py, llm-api/index_vault.py, chroma-index/ (marqué pour suppression, verrouillé par Cursor au moment du cleanup — sera supprimé au reboot). Vault enrichi : build-vault.py étendu pour générer automatiquement aliases (à partir du slug/titre + DOMAIN_ALIASES), answers (questions-types adaptées au type de note), priority (heuristique CV=10, MOCs=7, compétences=7, projets=5). Note CV curatée (source: manual) enrichie manuellement avec 12 aliases et 7 answers. Nouvelle vault-grasbot/TAXONOMIE.md qui documente le vocabulaire contrôlé. Réécriture de vault-grasbot/50-Technique/grasbot-rag.md → grasbot-retrieval.md (nouveau pipeline), + architecture-site.md + vault-structure.md + MOC-Technique.md. Nouveau endpoint POST /reload-vault pour recharger sans redémarrer uvicorn. Documentation interne refaite : 04-api-llm-et-chatbot.md, 06-strapi-extraction.md, nouveau 08-vault-obsidian-retrieval.md (remplace 08-vault-obsidian-rag.md). |
| 2026-04-24 | Doc + configuration : routes /competences/[slug]/[realisation], entité Strapi realisation-ia, tri order et comportement vignettes/richtext documentés dans 02-frontend-next.md, 04-api-llm-et-chatbot.md (parcours public), etat-actuel.md ; CONFIGURATION_SITE.md : section Contenu : compétences, réalisations IA et ordre d’affichage. Décision : pas de « phase 3 » homelab sur le site (consignée dans l’état actuel). |
| 2026-04-28 | Perf images Next : lots A/B/C + socle F documentés dans 09-performances-images.md — pickStrapiImage, next/image (listes, carousels, hero), remotePatterns, preconnect API. Lot B (compress: true) annulé : conflit IIS reverse proxy (500). |
| 2026-04-28 | Plan Server Components : nouveau doc 10-plan-server-components.md (périmètre, gains, ordre de migration, contraintes dev / layout). Aucun code modifié dans ce lot. |