Files
bruno 31d4616baf feat: garde-fous d'écriture des classeurs Excel #153 (P0)
L'édition d'un .xlsx pouvait détruire une partie du classeur, le
concurrencer en silence, ou diffuser une injection de formule.

- BUG-085 : inspect_workbook() détecte ce qu'un round-trip openpyxl perd
  (valeurs calculées en cache, slicers, contrôles, connexions, custom
  XML, signature, commentaires enrichis, macros) → xlsx_lossy_features
  exposé en lecture, bandeau FR/EN, et 409 xlsx_lossy_content sans
  `force` (confirmation explicite puis reprise). Périmètre réel
  revalidé : graphiques, images et TCD survivent au round-trip.
- BUG-086 : écriture atomique (fichier .tmp + os.replace) : un plantage
  ne peut plus tronquer le classeur, le backup reste intact.
- BUG-087 : verrou par fichier autour du read-modify-write (timeout 15 s,
  409 conflict) ; endpoint xlsx/save devenu synchrone pour que
  l'attente s'exécute dans le threadpool.
- BUG-088 : une saisie en '=' ou '@' est stockée en texte, sauf opt-in
  `allow_formula` ou le bouton f(x) de la visionneuse. Le handler
  ServiceError expose désormais code + details, que api() propage.
- BUG-084 : la suppression d'une vault purge enfin l'index inversé
  (documents fantômes qui continuaient de matcher) et is_stale() devient
  is_ready(), le nom étant trompeur (la staleness n'existe plus).

Tests : 1390 pytest, 10 JSDOM (xlsx-viewer.test.mjs, branché au CI),
3 E2E Playwright, suite E2E complète verte, ruff/mypy 0.

🤖 Generated with Codebuff
Co-Authored-By: Codebuff <[email protected]>
2026-09-27 20:39:12 -04:00

3.1 KiB

📚 Guides d'utilisation ObsiGate

Bienvenue dans le répertoire des guides utilisateur d'ObsiGate. Chaque guide est autonome, écrit en français et illustré d'exemples concrets (commandes, configuration, captures conceptuelles).

Vous découvrez ObsiGate ? Commencez par le Guide de prise en main. Une aide rapide est aussi intégrée directement dans l'application (menu Options → Guide d'utilisation, FR/EN, téléchargeable en Markdown et PDF).


🗂️ Sommaire des guides

Guide Public Contenu
🚀 Prise en main Tous Premier lancement, interface, navigation, vaults, raccourcis
🔍 Recherche, PDF, Excel & Excalidraw Tous Syntaxe de requête, recherche sémantique, lecteurs PDF/Excel, diagrammes
🤖 Assistant IA & Forge Tous Fournisseurs, éditeur IA, BooksLM, Forge, commandes @ / /
📝 Édition & collaboration Tous Édition simultanée, curseurs distants, persistance
📱 PWA & mode hors-ligne Tous Installation PWA, cache, file de synchronisation, notifications
🔌 API REST Développeurs Authentification, clés API, endpoints, exemples curl, SSE
🧩 Serveur MCP Développeurs / IA Brancher Claude Desktop, Cursor, Cline… sur vos vaults
🔒 Authentification & sécurité Admin Utilisateurs, MFA, permissions par vault, bonnes pratiques
🐳 Déploiement Docker Admin / Ops docker-compose, volumes, reverse proxy, mises à jour
🖥️ Application desktop (Tauri) Tous Installation, premier lancement, build depuis les sources

🧭 Par où commencer ?


📖 Documentation associée

Type Où
Vue d'ensemble produit README.fr.md · README.md
Conception détaillée par fonctionnalité docs/features/
Standards de code docs/CONTRIBUTING.md
Méthode de livraison (Definition of Done) docs/DELIVERY_WORKFLOW.md
Roadmap / travail à venir docs/ROADMAP.md
Historique des versions CHANGELOG.md
API interactive (Swagger / ReDoc) /docs · /redoc (instance ObsiGate)

Convention : ce répertoire est la porte d'entrée utilisateur. Le comment (utilisation) vit ici ; le pourquoi (conception technique) vit dans docs/features/. Ne jamais dupliquer le détail technique des fiches.