24 KiB
IMPORTANT — Lire d'abord Ce document utilise un format tabulaire simple et rigoureux conçu pour être maintenu à la fois par un humain (éditeur texte) et par un agent IA. Les règles exactes sont définies dans la section « Comment fonctionne ce document ». La procédure de livraison obligatoire (tests, docs, commit, push, CI) est définie dans
DELIVERY_WORKFLOW.md.
🐛 ObsiGate — Suivi des Bugs / TODO de Correction
Rôle du document : registre unique et vivant des bugs découverts et des corrections à apporter au projet ObsiGate (application Web + desktop Tauri). C'est l'outil de communication commun entre l'utilisateur humain et l'IA qui effectue les corrections dans le code.
- Projet : ObsiGate — Porte d'entrée web pour vaults Obsidian
- Stack : Python 3.11+ (backend FastAPI) · JavaScript/Vanilla (frontend) · Tauri/Rust (desktop)
- Dernière mise à jour : 2026-09-12
⚙️ Comment fonctionne ce document (À LIRE ABSOLUMENT)
Ce document est un contrat de travail partagé. Suivez les règles ci-dessous pour qu'un humain OU un agent IA puisse le lire, le modifier et l'exploiter sans ambiguïté.
1. Une table = un état (workflow par rangée)
Chaque bug/TODO est une rangée dans la section 📋 Registre des bugs / TODOs. Une rangée ne change jamais de table au fil de sa vie ; c'est la colonne « Statut » qui encode son avancement :
| Statut (colonne) | Signification | Qui peut le poser |
|---|---|---|
🔴 ouvert |
Bug confirmé / tâche à faire, en attente de traitement | Utilisateur ou IA |
🟠 en cours |
Un agent IA a commencé à corriger | IA uniquement |
🟢 corrigé |
La correction est écrite et vérifiée (tests OK) | IA uniquement |
✅ vérifié |
L'utilisateur (ou les tests) a validé le correctif | Utilisateur uniquement |
⚪ abandonné |
Décision de ne pas corriger (documentée dans notes) | Utilisateur ou IA |
2. Cycle de vie d'un bug (workflow)
flowchart LR
A[🔴 ouvert<br/>Découverte d'un bug] --> B[🟠 en cours<br/>IA travaille dessus]
B --> C[🟢 corrigé<br/>Correctif écrit + tests OK]
C --> D[✅ vérifié<br/>Re-validation par l'utilisateur]
C --> E[⚪ abandonné<br/>Refus / hors périmètre]
D --> F[✅ Fermé : lignée conservée en historique]
- Un bug est signalé → posé en
🔴 ouvertpar l'utilisateur ou l'IA (à l'issue d'une investigation ou d'une session de test). - L'IA prend en charge → passe le statut en
🟠 en coursavant de commencer à coder, et crée une entrée dans 🛠️ Journal des interventions AI. - La correction est terminée → l'IA exécute les tests pertinents, passe le statut en
🟢 corrigéet remplit la colonne « Correctif / Commit ». - Validation finale → c'est l'utilisateur qui passe en
✅ vérifiéune fois le correctif contrôlé. Les rangées✅ vérifiésont déplacées dans l'historique périodiquement. - Abandon → justifié obligatoirement dans la colonne « Notes / Scope ».
⚠️ Ne JAMAIS supprimer une rangée terminée : déplacez-la dans la section 📜 Historique des bugs résolus à la place.
3. Ordre de lecture pour un agent IA
Avant de corriger quoi que ce soit, un agent IA doit :
- Lire ce fichier en entier (en particulier ce guide et le registre).
- Identifier les rangées de statut
🔴 ouvertavec un scopeIAet une priorité élevée qui lui sont attribuées (colonne « Assigné »). - Poser le statut
🟠 en courssur la rangée choisie avant toute modification de code. - Corriger en respectant la checklist de vérification et les conventions du projet.
- Revenir mettre le statut à
🟢 corrigé, documenter le correctif, et journaliser son passage. - Ne pas marquer
✅ vérifiélui-même (c'est un droit utilisateur, sauf mention contraire explicite).
4. Identifiants uniques (ID)
- Chaque bug porte un ID stable
BUG-###ouTODO-###(voir le format dans le registre). - L'ID ne change jamais, même après résolution. Il permet de retrouver le bug dans l'historique et dans le journal d'interventions.
- Le format du numéro est
###= 3 chiffres incrémental (001, 002, 003…). - Si vous (IA) créez un nouveau bug, reprenez le plus grand numéro existant + 1 dans le registre, quel que soit l'ordre des lignes.
5. Comment mettre à jour ce document (bonnes pratiques)
- Formatage : garder les colonnes alignées par des espaces pour la lisibilité brute. Une rangée = une seule ligne de tableau Markdown.
- Copier-coller : pour ajouter un bug, dupliquez une ligne existante puis modifiez les champs.
- Ne pas casser : conservez le séparateur d'en-tête
|---|---|…|et les champs fixes (#, Titre, Statut, Priorité, Scope, Assigné, Zone, Cmd de repro, Correctif/Commit, Notes). - Frontière des rôles : un agent IA ne doit jamais se passer à lui-même une rangée en
✅ vérifié; il s'arrête à🟢 corrigé(sauf si l'utilisateur l'y autorise explicitement).
📋 Registre des bugs / TODOs
Légende colonnes :
- Statut :
🔴 ouvert|🟠 en cours|🟢 corrigé|✅ vérifié|⚪ abandonné- Priorité :
P0(critique/bloquant) ·P1(élevée) ·P2(normale) ·P3(basse/cosmétique)- Scope :
📱 frontend·⚙️ backend·🔌 api·🧩 tests·🖥️ desktop·📦 build·📄 docs·🤖 ia·❓ inconnu(À affiner par l'IA)- Assigné :
IA(à traiter par un agent) ·USER(à traiter par l'utilisateur) ·—(non attribué)- Zone : chemin/nom de fichier concerné (ex.
frontend/app.js,backend/search.py)- Cmd de repro : commande ou scénario permettant de reproduire / vérifier (vide si N/C)
Bugs ouverts (à traiter)
| # | Titre | Statut | Priorité | Scope | Assigné | Zone (fichier) | Cmd de repro | Correctif / Commit | Notes |
|---|---|---|---|---|---|---|---|---|---|
| BUG-001 | L'ouverture des fichier PDF ne fonctionne pas et donne l'erreur Internal Server Error | 🟢 corrigé | P1 | fichier PDF | IA | backend/main.py |
GET /api/file/{vault}/pdf/stream?path=…(pdf à nom accentué) |
backend/main.py : Content-Disposition encodé RFC 5987 (helper _content_disposition) |
500 car nom Unicode brut dans l'en-tête → header invalide. Vérifié: stream 200 / Range 206 + test tests/test_pdf_stream.py |
| BUG-002 | l'ouverture d'un fichier .excalidraw ne fonctionne pas et affiche toujours Loading Excalidraw… | 🟢 corrigé | P1 | fichier .excalidraw | IA | frontend/excalidraw-editor.html |
Ouvrir un fichier .excalidraw |
frontend/excalidraw-editor.html : alias esm.sh supprimé (408 jotai) + React 19 cohérent + prop excalidrawAPI |
2 causes: 408 esm.sh sur ?alias + prop legacy excalidrawRef inopérante en 0.18. Vérifié navigateur: Loading masqué + cycle save OK |
| BUG-003 | mypy : 33 erreurs de typage (étape CI en mode advisory → bloquante) |
🟢 corrigé | P2 | ⚙️ backend | IA | backend/{main,indexer,export,pdf_reader,bookslm_routes}.py, backend/auth/router.py, .gitea/workflows/ci.yml |
mypy backend/ --ignore-missing-imports |
Annotations de types, gardes None (auth/router), import PROVIDERS manquant (bug latent main.py:4523), PdfReader: Any ; CI mypy rendu bloquant |
0 erreur après correction. PROVIDERS non importé → NameError avalé par le except (le modèle par défaut n'était jamais prépendé). Tests : 728 passed |
| BUG-004 | Lien cassé vers CONTRIBUTING.md dans README.md |
🟢 corrigé | P3 | 📄 docs | IA | README.md |
Cliquer le lien « Contributing » | README.md : lien → docs/CONTRIBUTING.md (+ DELIVERY_WORKFLOW.md) ; arbre du projet corrigé |
README.fr.md pointait déjà correctement vers ./docs/CONTRIBUTING.md |
| BUG-005 | Sur mobile via Cloudflare (og.dracodev.net), le site ne charge pas complètement même après purge des caches (téléphone + Cloudflare) |
🟢 corrigé | P1 | 📱 frontend + ⚙️ backend | IA | frontend/sw.js, frontend/index.html, frontend/js/sync.js, backend/main.py |
Ouvrir og.dracodev.net sur mobile (PWA installée), purger les caches, recharger |
SW network-first pour le code + caches versionnés (SW_VERSION) ; précache corrigé (/static/js/…) ; migration ponctuelle localStorage ; Cache-Control: no-cache (le middleware renvoyait immutable 1 an sur /static) ; tests tests/frontend/sw.test.mjs + TestStaticCaching |
Cause : SW cache-first à nom fixe + en-têtes immutable non fingerprinted → ancien build servi indéfiniment (Cache Storage ≠ cache navigateur/CF). Vérifié : 754 tests backend, frontend OK |
| BUG-006 | Clé API DeepSeek réelle commitée en clair dans .env.example |
🟢 corrigé | P0 | 📄 docs + 🔐 sécurité | IA | .env.example |
git grep "sk-" .env.example |
.env.example : clé remplacée par un placeholder (sk-xxx…) + modèle deepseek-chat |
⚠️ Rotation de la clé requise : elle reste dans l'historique Git → révoquer/régénérer côté DeepSeek. Le fichier .env (réel) est bien gitignoré |
| BUG-007 | Assistant IA : menus / et @ — navigation clavier ↑/↓ inopérante et filtrage des skills cassé par les accents |
🟢 corrigé | P1 | 📱 frontend | IA | frontend/js/bookslm.js |
Taper /résumé ou @café, puis ↑/↓ |
bookslm.js : motifs Unicode \p{L} (détection + sélection), recherche normalisée NFD (insensible aux accents), jeton _menuSeq (rendus async obsolètes), scrollIntoView de l'élément actif |
Le menu se fermait dès la saisie d'un accent ; la frappe rapide pouvait écraser le menu avec un résultat obsolète. Tests : tests/frontend/ai.test.mjs (+3) |
| BUG-008 | Assistant IA : commande @ — chemins accentués + contexte ad-hoc ignoré en mode Général |
🟢 corrigé | P1 | 📱 frontend + ⚙️ backend | IA | frontend/js/bookslm.js, backend/bookslm_routes.py |
@fichier-accentué puis envoyer en mode Général |
Frontend : détection Unicode + repli vault=all sans vault courant. Backend : _resolve_system_prompt résout le vault optionnel dès qu'un contexte @ est présent (mode Général) |
Le backend ignorait extra_files/extra_directories en mode Général (vault_path is None). Tests : tests/test_bookslm.py (+2) et tests/frontend/ai.test.mjs |
| BUG-009 | Assistant IA : liste de modèles corrompue (art ASCII) et clés i18n brutes (ai.model_search) sous OpenRouter |
🟢 corrigé | P1 | 📱 frontend | IA | frontend/js/ai.js, frontend/js/i18n.js, frontend/sw.js, frontend/style.css |
Ouvrir le menu modèle sous « openrouter » | Locale non content-hashée en cache HTTP → cache:'no-store' + bump SW_VERSION v4 ; styles critiques du picker appliqués en ligne (popover absolu, liste en colonne, options display:block) ; rendu plafonné à 200 modèles + indicateur « … N autres » |
OpenRouter expose plusieurs centaines de modèles ; si style.css est en cache, la liste s'affichait en bloc inline (art ASCII) et les clés i18n brutes provenaient d'un fr.json obsolète. Tests : tests/frontend/ai.test.mjs (+1) |
| BUG-010 | Assistant IA : la commande @ n'ajoute pas le contexte à la requête en mode Général |
🟢 corrigé | P1 | 📱 frontend | IA | frontend/js/bookslm.js |
Assistant en mode Général, taper @fichier, sélectionner, envoyer |
Capture du vault renvoyé par /api/tree-search dans la sélection @ ; _contextVault() propage ce vault aux requêtes /context et /chat ; recherches @ suivantes limitées à ce vault |
En mode Général, _vault est nul : la requête partait sans vault et le backend ignorait extra_files. Tests : tests/frontend/ai.test.mjs (+1) |
| BUG-011 | Assistant IA : noms de modèles illisibles dans la liste déroulante | 🟢 corrigé | P2 | 📱 frontend | IA | frontend/js/ai.js, frontend/style.css |
Ouvrir le menu modèle dans la barre latérale de l'assistant | Popover aligné à droite du déclencheur (right:0), largeur 340 px bornée à 100vw - 24px, noms sur plusieurs lignes (overflow-wrap:anywhere, police 0,78 rem) + title |
La liste s'ouvrait vers la droite et dépassait le bord de la sidebar ancrée à droite ; noms tronqués. Tests : tests/frontend/ai.test.mjs |
| BUG-012 | Assistant IA : la commande @ n'affiche aucun menu de sélection en mode Général |
🟢 corrigé | P1 | 📱 frontend | IA | frontend/js/bookslm.js |
Assistant en mode Général (aucun vault), taper @ |
_showMentionMenu rend toujours le menu (même vide) et _activeVault() retombe sur state.selectedContextVault puis le premier state.allVaults, avant vault=all pour les requêtes |
Sans vault résolu, l'ancien code masquait le menu et le backend ignorait le contexte. Tests : tests/frontend/ai.test.mjs (+1) |
| BUG-013 | Assistant IA : les liens fichiers/répertoires des réponses affichent « Aucun vault actif pour ouvrir ce lien » | 🟢 corrigé | P1 | 📱 frontend | IA | frontend/js/bookslm.js |
En mode Général, cliquer un lien de fichier/dossier dans une réponse | _openFileLink() et _revealPath() utilisent _activeVault() (vault de contexte → vault sélectionné → premier vault) au lieu de _resolveVault() seul |
_resolveVault() est nul sans document ouvert ; les liens échouaient en mode Général. Tests : tests/frontend/ai.test.mjs (+1) |
| BUG-014 | Assistant IA : les flèches ↑/↓ ne naviguent pas dans les menus / et @ |
🟢 corrigé | P1 | 📱 frontend | IA | frontend/js/bookslm.js |
Ouvrir /, puis ↑/↓ (y compris après un clic hors zone de texte) |
Navigation gérée au niveau du panneau en phase de capture (panel.addEventListener('keydown', ..., true)), donc indépendante du focus |
Le keydown n'était écouté que sur la zone de texte ; dès que le focus changeait, les flèches étaient ignorées. Tests : tests/frontend/ai.test.mjs (+1) |
| BUG-015 | Assistant IA : la ligne sélectionnée des menus / et @ est invisible au clavier |
🟢 corrigé | P2 | 📱 frontend | IA | frontend/style.css |
Ouvrir / ou @, naviguer avec ↑/↓ |
État .active en --bg-hover + barre d'accent à gauche (inset 3px 0 0 var(--accent)) au lieu de --surface2 |
--surface2 est identique à --bg-primary (fond du menu) en thème sombre : la sélection ne se voyait pas. Idem pour la liste de modèles |
TODOs techniques (améliorations / nouvelles tâches)
| # | Titre | Statut | Priorité | Scope | Assigné | Zone (fichier) | Cmd de repro | Correctif / Commit | Notes |
|---|---|---|---|---|---|---|---|---|---|
| (exemple) TODO-002 | Rendre l'index inversé incrémental (40k+ fichiers) | 🔴 ouvert | P1 | ⚙️ backend | IA | backend/indexer.py, backend/search.py |
Recherche sur très gros vault | — | Exemple à remplacer. Cf. plan.md |
| (À remplir) |
🛠️ Journal des interventions AI
Chaque passage d'un agent IA qui modifie du code ou l'état du registre est journalisé. Règle : l'IA ajoute une ligne à la fin de ce tableau à chaque session de correction. Colonnes :
Date(YYYY-MM-DD) ·ID(s) traité(s)·Action·Fichiers modifiés·Résumé·Statut après.
| Date | ID(s) traité(s) | Action | Fichiers modifiés | Résumé | Statut après |
|---|---|---|---|---|---|
| (exemple) 2026-06-15 | BUG-001 | Correction | frontend/app.js |
Réécriture de renderFile() pour préserver le DOM dashboard |
🟢 corrigé (en attente vérif) |
| 2026-09-09 | BUG-001, BUG-002 | Correction | backend/main.py, frontend/excalidraw-editor.html, tests/test_pdf_stream.py |
BUG-001: Content-Disposition RFC 5987 (nom PDF accentué ne casse plus l'en-tête → plus de 500). BUG-002: suppression alias esm.sh (408 jotai) + React 19 cohérent + prop excalidrawAPI → Loading masqué, save OK. Vérifié: 534 tests backend verts + E2E navigateur. |
🟢 corrigé (en attente vérif utilisateur) |
| 2026-09-11 | BUG-003, BUG-004 | Correction | backend/{main,indexer,export,pdf_reader,bookslm_routes}.py, backend/auth/router.py, .gitea/workflows/ci.yml, README.md, README.fr.md |
BUG-003: 33 erreurs mypy corrigées (annotations, gardes None, import PROVIDERS manquant → bug latent) + étape CI mypy rendue bloquante. BUG-004: lien README.md → docs/CONTRIBUTING.md. Vérifié: mypy 0 erreur, ruff OK, pytest 728 passed, frontend OK. |
🟢 corrigé (en attente vérif utilisateur) |
| 2026-09-11 | BUG-005 | Correction | frontend/sw.js, frontend/index.html, frontend/js/sync.js, backend/main.py, .gitea/workflows/ci.yml, tests/frontend/sw.test.mjs, tests/test_api_main.py |
BUG-005: chargement mobile incomplet via Cloudflare. SW réécrit en network-first pour HTML/JS/CSS + caches versionnés ; précache corrigé (/static/js/…) ; kill-switch de session remplacé par une migration localStorage ponctuelle ; en-têtes /static passés de immutable 1 an à no-cache ; index.html/manifest/SPA en no-cache ; reload unique sur controllerchange. Vérifié: 754 tests backend, frontend 9+28+8 OK, ruff/mypy OK. |
🟢 corrigé (en attente vérif utilisateur) |
| 2026-09-11 | BUG-006 | Correction sécurité | .env.example |
Clé API DeepSeek réelle exposée dans .env.example → remplacée par un placeholder. Rotation de la clé à faire côté DeepSeek (présente dans l'historique Git). |
🟢 corrigé (rotation à confirmer par l'utilisateur) |
| 2026-09-12 | BUG-007, BUG-008, #82 | Correction + refonte UI | frontend/js/bookslm.js, frontend/js/ai.js, frontend/style.css, frontend/locales/{fr,en}.json, backend/bookslm_routes.py, tests/frontend/ai.test.mjs, tests/test_bookslm.py |
BUG-007 : motifs Unicode + recherche NFD insensible aux accents + navigation ↑/↓ fiabilisée (jeton de séquence, scrollIntoView). BUG-008 : contexte ad-hoc @ pris en compte en mode Général (backend) + repli vault=all. #82 : section « Fournisseur & modèle » compacte (recherche modèle + bulle capacités ℹ️ au survol/clic/appui long). Vérifié : tests frontend 41/41, tests/test_bookslm.py 47 passed. |
🟢 corrigé (en attente vérif utilisateur) |
| 2026-09-12 | BUG-009 | Correction | frontend/js/ai.js, frontend/js/i18n.js, frontend/sw.js, frontend/style.css, frontend/locales/{fr,en}.json, tests/frontend/ai.test.mjs |
BUG-009 : locale non content-hashée servie depuis le cache HTTP → clés i18n brutes ; passage en cache:'no-store' + SW_VERSION v4. Liste de modèles corrompue (OpenRouter, styles en cache) → styles critiques en ligne, options display:block, plafond 200 + indicateur. Vérifié : tests frontend 42/42. |
🟢 corrigé (en attente vérif utilisateur) |
| 2026-09-12 | BUG-010, BUG-011 | Correction | frontend/js/bookslm.js, frontend/js/ai.js, frontend/style.css, tests/frontend/ai.test.mjs |
BUG-010 : capture du vault des résultats @ + _contextVault() propagé aux requêtes /context//chat (mode Général). BUG-011 : popover modèle aligné à droite, largeur 340 px, noms multi-lignes + title. Vérifié en navigateur (Playwright) et tests frontend 43/43. |
🟢 corrigé (en attente vérif utilisateur) |
| 2026-09-12 | BUG-012, #82 | Correction + UX | frontend/js/bookslm.js, frontend/js/ai.js, frontend/style.css, frontend/sw.js, frontend/locales/{fr,en}.json, tests/frontend/ai.test.mjs |
BUG-012 : le menu @ est toujours rendu et _mentionVault() retombe sur le vault de contexte puis le premier vault disponible. #82 : suppression des intitulés « Fournisseur & modèle » / « Fournisseur : », description du contexte Général déplacée en info-bulle, placeholder retiré, bouton Envoyer en emoji ✈️, indicateur d'activité (envoi/réception/outils/confirmation/succès/échec), SW_VERSION v5. Vérifié Playwright + tests frontend 45/45. |
🟢 corrigé (en attente vérif utilisateur) |
| 2026-09-12 | BUG-013, BUG-014 | Correction | frontend/js/bookslm.js, frontend/index.html, frontend/sw.js, tests/frontend/ai.test.mjs |
BUG-013 : liens fichiers/dossiers via _activeVault() (vault de contexte → sélection → premier vault). BUG-014 : navigation ↑/↓ gérée au niveau du panneau en phase de capture. Purge des caches élargie (SW_VERSION v6, migration obsigate-*). Vérifié : tests frontend 47/47, pytest 930. |
🟢 corrigé (en attente vérif utilisateur) |
| 2026-09-12 | BUG-015, #82 | Correction + UX | frontend/js/bookslm.js, frontend/style.css, tests/frontend/ai.test.mjs |
BUG-015 : sélection des menus / et @ rendue visible (--bg-hover + barre d'accent à gauche) car --surface2 = --bg-primary. #82 : retrait de l'indice clavier sous la zone de saisie. Vérifié Playwright (contraste #1f2430 vs #0f1117 + barre accent) et tests frontend 47/47. |
🟢 corrigé (en attente vérif utilisateur) |
| 2026-09-12 | #82 | Amélioration perf + UX | backend/services/search.py, backend/main.py, frontend/js/bookslm.js, frontend/js/ui.js, frontend/style.css, tests/test_api_main.py, tests/frontend/ai.test.mjs |
#82 : endpoint GET /api/vault/{vault}/paths + préchargement et filtrage client du menu @ (instantané) ; sélecteurs Fournisseur/Modèle agrandis (0,8 rem / 34 px) ; « 🧠 BooksLM » ajouté au menu contextuel de la racine des vaults. Vérifié : pytest 151 (ciblés) + ruff/mypy, tests frontend 49/49. |
✅ livré (en attente vérif utilisateur) |
| 2026-09-12 | #82 | UX | frontend/js/ai.js, frontend/style.css, tests/frontend/ai.test.mjs |
Sélecteurs Fournisseur/Modèle alignés à droite dans la barre de l'assistant et réordonnés : capacité du modèle (ⓘ) → fournisseur → modèle. Bulle de capacités ouverte vers la droite (left: 0). Test JSDOM de l'ordre. Vérifié : tests frontend 49/49. |
✅ livré (en attente vérif utilisateur) |
📜 Historique des bugs résolus
Les rangées
✅ vérifié(ou⚪ abandonné) sont déplacées ici régulièrement pour garder le registre actuel court et lisible. Conservez l'ID d'origine pour la traçabilité.
| # | Titre | Date résolution | Résolu par | Correctif / Commit | Notes |
|---|---|---|---|---|---|
| (aucun pour l'instant) |
🧪 Procédure de vérification d'une correction (pour l'IA)
Quand une correction est écrite, l'agent IA doit avant de passer en 🟢 corrigé :
- Exécuter les tests du projet :
- Backend :
python -m pytest tests/ -v(oupytest) - S'il existe des tests ciblés sur la zone modifiée, les lancer en priorité.
- Backend :
- Vérifier le lancement du module concerné (import sans erreur, endpoint répond).
- Relire sa propre diff pour éviter les régressions.
- Mettre la colonne « Correctif / Commit » à jour puis le statut en
🟢 corrigé. - Si un test échoue ou que la correction est incomplète, rester en
🟠 en courset le noter.
✔️ Checklist de traitement d'un bug (rappel pour toute IA)
- Bug identifié avec un ID et repris dans le registre
- Statut posé en
🟠 en coursavant de coder - Correction conforme aux conventions du projet
- Tests exécutés et vert (colonne « Correctif / Commit » renseignée)
- Journal des interventions AI mis à jour
- Statut passé en
🟢 corrigé(pas✅ vérifiésauf autorisation) - (Après validation utilisateur) rangée déplacée dans l'historique
📚 Liens utiles
- Guide de contribution : CONTRIBUTING.md (conventions de code)
- Structure du projet : README.fr.md
- Tests : répertoire
tests/— voir CONTRIBUTING - Analyse/décisions complémentaires : IMPLEMENTATION_PLAN.md, ROADMAP.md