docs(wiki): RC4 — notes de version, et 23 defauts documentes qui n'existent plus
Le wiki citait 23 issues comme ouvertes. Toutes sont fermees : chaque
« voir issue #N » decrivait donc un defaut corrige, et le wiki decrivait
une application qui n'existe plus.
Nouvelles notes de version (3.4), sur le modele des RC3 : orientees
utilisateur, ordonnees par ce qu'on perdait ou voyait de faux plutot que
par famille technique. La section 1 s'ouvre sur les deux defauts qui
retiraient du texte d'un livre exporte, parce que c'est ce qu'un auteur
doit lire en premier.
Dix-huit pages corrigees. Le plus souvent, un long paragraphe decrivant un
bug verifie dans le code est remplace par sa resolution — d'ou un diff qui
retire plus de lignes qu'il n'en ajoute. Les affirmations les plus
trompeuses etaient :
- les reglages d'ouvrage « n'ont aucune UI » (ils en ont une depuis la RC4)
- l'export Word d'un livre cite « sort vide » (corrige)
- le corpus manuscrit sans interface (elle existe)
- le compresseur de contexte « jamais appele » (cable, et ses trois
distorsions corrigees)
- `embeddingProvider` sans controle (section Embeddings)
- le filtre par collection absent, le bouton OCR manuel injoignable, le
toggle des noeuds auteurs desactive en dur
Home annonce la RC4 ; Features passe en 1.0.0-rc.4 et gagne deux sections
— corpus manuscrit et accessibilite — qui n'avaient nulle part ou vivre.
Les limitations connues des notes RC4 sont argumentees, pas subies :
pdfjs-dist renvoie a #77, et le mode de detection seule de l'inspecteur
explique pourquoi une source primaire contenant des imperatifs ne doit pas
etre tronquee.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
docs(wiki): corriger la prémisse fausse de l'issue #29 (busy timeout)
Une contre-vérification adversariale des 40 issues filées par l'audit a
réfuté la prémisse centrale de l'issue #29 : better-sqlite3 applique par
défaut un timeout de 5000 ms à toute connexion (database.js :
`'timeout' in options ? options.timeout : 5000`) — le « 0 ms par défaut »
affirmé ne vaut que pour SQLite brut. L'issue a été retitrée et déclassée
sur GitHub ; les deux pages du wiki qui portaient cette affirmation sont
corrigées en conséquence :
- Obsidian Vault Guide : l'encadré « SQLITE_BUSY immédiat » devient un
risque résiduel étroit — seule une transaction d'écriture tenant le
verrou plus de 5 secondes (grosse réindexation par lot) peut encore
pousser un écrivain concurrent en SQLITE_BUSY ; la recommandation qui
survit est d'aligner les 3 écrivains sans WAL sur ObsidianVaultStore.
- Tropy Integration Guide : même correction sur l'encadré de concurrence
de l'auto-resync, et la note de conception sur la connexion non fermée
ne cite plus « l'absence de busy_timeout » comme facteur aggravant.
C'est le seul faux positif trouvé par la passe de re-vérification : les
39 autres issues de l'audit tiennent, et les 7 issues utilisateur
anciennes (#1, #2, #3, #9, #10, #11, #12) sont toutes confirmées contre
le code avec leur cause racine.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
docs(wiki): quinzième passe — course Zotero inter-projets, watcher Tropy orphelin, BibTeX perd les entrées sans auteur
Six nouveaux bugs applicatifs réels trouvés et filés cette passe, la
plupart via un angle « que se passe-t-il si on change de projet pendant
une opération en cours » appliqué systématiquement à chaque intégration :
- issue #33 (le plus sérieux) : une synchronisation Zotero relit le
vectorStore du projet ACTUELLEMENT ouvert après son await réseau, pas
celui qui a démarré la synchronisation — changer de projet pendant
une synchronisation en cours écrit les collections du projet A dans
le projet B. Corruption de données inter-projets réelle, pas juste
une fuite ou un glitch d'affichage.
- issue #34 : TropyService.init() remplace this.watcher sans jamais
appeler .unwatch() sur l'ancien (contrairement au registre LLM juste
à côté, qui a son disposePreviousRegistry() explicite) — un watcher
orphelin peut déclencher une resynchronisation du mauvais projet.
- issue #35 : le canal de progression d'indexation Obsidian
(fusion:vault:progress) ne porte aucun identifiant de projet —
affichage seulement, aucune corruption de données puisque l'écriture
elle-même reste bien scopée.
- issue #31 : l'événement d'expiration d'une proposition IA lors d'un
changement de chapitre est journalisé sous le chemin du chapitre
qu'on vient de rejoindre, pas celui qu'on quitte — la destruction de
la vue CodeMirror se produit après que le store ait déjà basculé son
filePath.
- issue #32 : l'import BibTeX rejette silencieusement toute entrée sans
champ author (pas de repli sur editor), perdant les volumes collectifs
et travaux anonymes courants en bibliographie historique — seul un
console.warn, aucun signal côté interface.
- issue #36 : npm run lint échoue immédiatement, aucune configuration
ESLint n'existe dans le dépôt (déjà su et documenté dans le
commentaire du workflow CI, mais jamais remonté dans le wiki ni
retiré du script).
Autre trouvaille notable (pass fusionné après un traçage de bout en
bout du pipeline Tropy) : l'ordre de priorité des transcriptions était
mal documenté depuis le début (notes Tropy > transcription externe
type Transkribus > OCR — pas « notes > OCR > manuel » comme l'affirmait
une version antérieure), et le chunking des sources primaires est en
réalité figé en taille fixe (DocumentChunker), jamais le chunker
adaptatif utilisé par les PDF — corrigé sur Technical Architecture.
Cluster meta & notes de version entièrement converti en lecture vide
cette passe : Ethics.md a enfin eu sa première lecture véritablement
approfondie (aucune affirmation factuelle vérifiable trouvée, page
confirmée inerte plutôt que simplement non examinée) et un nouvel
échantillon de notes de version RC2/RC3 vérifié contre les tags git
réels a tenu sans exception.
docs(wiki): quatorzième passe — brain.db sans busy_timeout, course export/renumérotation, affirmation de confidentialité incomplète
Deux nouveaux bugs applicatifs réels trouvés et filés cette passe :
- issue #29 : aucune des quatre classes qui écrivent dans le brain.db
partagé (VectorStore, PrimarySourcesVectorStore, HistoryManager,
ObsidianVaultStore) ne définit de busy_timeout — seul le module
Obsidian active le mode WAL. Le journal.db séparé a déjà ce
correctif exact (WAL + busy_timeout=3000, avec un commentaire
explicite sur l'écriture concurrente) mais il n'a jamais été
appliqué au fichier partagé, qui a pourtant plus d'écrivains
concurrents. Documenté dans les guides Obsidian et Tropy.
- issue #30 : la renumérotation des notes à l'échelle du livre écrit
chapitre par chapitre sur le disque sans verrou — un export
déclenché pendant la boucle peut assembler un manuscrit à moitié
renuméroté, silencieusement. Le rollback en cas d'échec protège
contre les échecs internes de l'opération, pas contre une lecture
concurrente par l'export. Documenté dans Books-and-Chapters.
Autres corrections :
- Build and Deployment Guide : l'affirmation de confidentialité
« aucune donnée envoyée sauf Zotero » se contredisait avec la phrase
juste au-dessus mentionnant les fournisseurs cloud — réécrite pour
lister les trois catégories réelles de sortie de données optionnelle
(Zotero, fournisseur LLM cloud, connecteurs d'archives).
- Technical Architecture : traçage complet d'un scénario de bout en
bout (PDF de 200 pages → indexation → récupération Brainstorm) a
révélé un mécanisme jamais documenté en 13 passes — l'extraction PDF
tourne dans un processus enfant Node système isolé (contournement
d'un crash pdfjs-dist), avec un timeout de 120s, une file d'attente
séquentielle globale (un PDF à la fois, jamais en parallèle), et une
exigence de binaire Node système séparé d'Electron. Documentation
aussi d'un second filet de sécurité (EMBED_CHAR_CAP=6000 caractères
dans PdfIndexer.ts, indépendant de la troncature côté Ollama).
- Features.md : la bascule automatique Ollama→embarqué est en réalité
asymétrique entre génération (toujours) et embeddings (seulement si
les dimensions correspondent) — précision ajoutée, déjà documentée
ailleurs mais pas ici.
- Logging System : la table « comportement par défaut » laissait
penser à un mécanisme unique de filtrage alors que celui du renderer
n'est jamais réellement actif (aucun `process` global) — précision
ajoutée après trois passes de corrections successives sur cette même
page qui n'avaient jamais été reconciliées entre elles.
Meta & notes de version : une seule correction mineure de cohérence
interne sur Logging System, rien d'autre trouvé sur les notes de
version elles-mêmes malgré la recherche de contradictions avec les
pages actuelles.
docs(wiki): onzième passe — Unlink Obsidian écrase brain.db, compression de contexte jamais câblée
Deux bugs applicatifs sérieux trouvés et filés cette passe, en changeant
de méthode sur le cluster brainstorm/intégrations (deux passes propres
consécutives, donc recherche de contradictions inter-pages et de
collisions sur des ressources partagées plutôt que répéter les mêmes
vérifications) :
- issue #27 : le bouton « Unlink » d'un carnet Obsidian supprime le
fichier .cliodeck/brain.db tout entier via fs.unlink, pas seulement
l'index du carnet — obsidianStorePath() pointe vers le même fichier
partagé que les vecteurs PDF, l'index Tropy et le journal de
recherche depuis la consolidation. Documenté dans
1.14-Obsidian-Vault-Guide.md.
- issue #28 : le système de compression de contexte RAG
(ContextCompressor.ts) n'est appelé nulle part dans le vrai chemin de
requête — retrieval-service.ts ne renseigne jamais le champ
`compression` que chat-engine.ts vérifie en aval. Tout contexte
récupéré part vers le LLM sans compression, quelle que soit sa
taille. Documenté dans 2.-Technical-Architecture.md (section
renommée « declared but dead »).
Autres corrections :
- Brainstorm Mode Guide + MCP Integration Guide : une vraie UI de
bascule par outil existe désormais (bannière MCP, classification
lecture/écriture avec opt-in explicite pour les outils d'écriture) —
la note « UI minimale » était périmée, remplacée par une section
complète.
- Keyboard Shortcuts : nuances plateforme sur F11 (plein écran) et F12
(DevTools) sur macOS, même classe de lacune que Cmd+W (passe 10).
- Logging System : dernière formulation trop large sur les DevTools et
les variables d'environnement corrigée (seul CLIODESK_DEBUG/DEBUG
ouvre les DevTools, pas CLIODESK_LOG_LEVEL ; les logs renderer
révélés n'existent de toute façon plus dans le bundle de production).
- RC2 Release Notes : le « problème connu » sur l'étape export des
recipes était factuellement faux (document_id était déjà honoré à ce
tag) — remplacé par la vraie limitation de l'époque (projectType
'article' figé), corrigée avant RC3.
- Features.md : tableau de bord statistiques a 5 onglets, pas 4 (onglet
Tags manquant).
- Installation Linux : bibliothèques système manquantes dans le
résumé (libsecret-1, libgbm) alors que présentes dans la commande
d'installation réelle.
- Build and Deployment Guide : build:all ne construit que pour la
plateforme hôte, pas toutes les plateformes ; stockage des clés API
documenté avec son repli en clair non signalé ailleurs quand le
chiffrement OS n'est pas disponible.
docs(wiki): champ TITRE mal décrit, diagnostic de note ignorée invérifiable
- TITRE : la page donnait le chemin relatif complet comme exemple
typique. En réalité (retrieval-service.ts : h.note.title ||
h.note.relativePath), le titre normal vient du frontmatter, du
premier H1, ou du nom de fichier nu (ObsidianMarkdownParser.ts) — le
chemin relatif n'est qu'un repli de dernier recours.
- « Consultez les logs de l'indexeur dans DevTools » pour savoir
pourquoi une note a été ignorée : aucun console.log dans tout le
dossier obsidian/, et le handler IPC ne renvoie que des compteurs
agrégés — aucune raison par note n'est exposée nulle part.
docs(wiki): troisième passe — Obsidian et Tropy, encore, avec de nouvelles erreurs
Ces deux pages ont produit des erreurs distinctes à chacune des trois
passes — signe qu'elles avaient été rédigées sans confrontation
systématique au code dès le départ.
Obsidian Vault Guide :
- « champ frontmatter connu pour être ignorable » : fabriqué. Le vrai
SkipReason (scan-report.ts:24-32) a huit variantes structurelles
(fichier caché, note vide, contenu binaire, erreur de parsing
frontmatter, trop volumineux, exclu par motif, illisible, wikilinks
cassés) — aucun réglage utilisateur n'existe pour exclure une note.
- Tableau des combinaisons de filtres de récupération : la combinaison
« Biblio + Primary sans notes » manquait, vérifiée dans
resolveRetrievalArgs (fusion-chat-service.ts).
- Libellé du bouton corrigé (« Link a vault… », pas « Link vault »).
Tropy Integration Guide :
- Ordre de priorité des transcriptions inversé : la page plaçait l'OCR
avant Transkribus, mais TropySync.ts:235-279 cherche Transkribus en
second (avant l'OCR, qui n'est tenté qu'en dernier recours).
- Section « Surveillance automatique » entièrement fabriquée : la page
décrivait une notification proposant la resynchronisation. Vérifié
dans tropy-service.ts et primarySourcesStore.ts — la resynchronisation
est automatique et silencieuse, sans aucune alerte affichée ; une
erreur du watcher n'a même aucun relais côté interface aujourd'hui.
docs(wiki): deuxième passe — corriger une erreur dans ma propre réécriture, et un vrai manque d'UI
**Erreur dans ma propre correction précédente** :
- Guide des LLM embarqués : j'avais écrit que embeddingProvider se
règle « dans Paramètres → LLM » au même titre que generationProvider.
Faux — vérifié frais : grep sur tout src/renderer/ pour
"embeddingProvider" ne retourne aucun fichier ; RAGSettingsPanel.tsx
n'écrit jamais que generationProvider ; EmbeddedLLMSection.tsx ne
contient aucune occurrence du mot "embedding". Le moteur sait faire
des embeddings embarqués, mais rien dans l'interface ne permet de
les sélectionner ou de télécharger le modèle — seule l'édition
manuelle du fichier de configuration le permet aujourd'hui. Corrigé
à quatre endroits de la page, et signalé comme un vrai manque produit
en issue #18 (https://github.com/cliodeck/cliodeck-app/issues/18),
pas seulement un défaut de documentation.
**Erreur dans ma réécriture du guide Word Templates** : le découpage en
trois routes d'export était faux. Vérifié frais dans word-export.ts —
mergeWithTemplate() (fusion par {placeholders}) ne dépend que de
templatePath, pas du tout de useEnginePipeline. Il n'y a que deux
mécanismes réels : pandoc+reference-doc (styles, uniquement si
bibliographie + pandoc + moteur de citation non demandé), et
native+docxtemplater (placeholders, dans tous les autres cas — y
compris bibliographie + moteur de citation demandé, que ma première
version traitait à tort comme une troisième route « à base de styles »).
**Erreurs ratées par la première passe** :
- Corpus Analysis Guide : langue par défaut du topic modeling annoncée
« Français », en réalité « multilingual » (main.py:54-56,
useCorpusData.ts:145).
- Journal and History : une « icône History dans le panneau de chat »
fabriquée — AssistantChat.tsx n'a aucune référence à l'historique ;
le vrai composant de navigation (ChatHistoryView.tsx) ne vit que dans
le panneau Journal. Reformulé pour dire que c'est la même donnée,
pas une fonctionnalité séparée.
- Technical Architecture : la section Primary Sources (Tropy) décrivait
encore un vector store autonome (sources.db/sources.hnsw) alors que
PrimarySourcesVectorStore utilise le brain.db partagé depuis la
fusion — contradiction interne avec la section Key Architecture Files
déjà corrigée sur cette même page. L'étape « Dense Search » appelait
encore ollamaClient.generateEmbedding(), contredisant l'étape
Embedding Generation juste au-dessus, déjà corrigée elle aussi.
- Obsidian Vault Guide : « alongside the other workspace databases
(vectors.db, primary-sources.db) » — ces deux noms sont pré-fusion,
le vrai voisin est brain.db.
docs(wiki): deuxième passe — corriger vectors.db, une régression de numérotation, et deux erreurs de sécurité factuelle
Cette repasse adversariale a trouvé des erreurs que la première n'avait
pas vues, y compris deux que j'ai moi-même introduites en corrigeant
autre chose.
**Régression introduite par mes propres corrections précédentes** :
- Les arborescences de projet réécrites dans les guides Linux/macOS
citaient `vectors.db` comme fichier d'index PDF. Vérifié frais contre
backend/core/workspace/layout.ts:67 — le nom réel est `brain.db`,
store partagé (PDF + Tropy + historique) depuis la fusion. `vectors.db`
n'est qu'un nom pré-fusion, uniquement pertinent pour la migration
d'anciens projets. Corrigé dans 1.-ClioDeck-Installation.md,
1.1-Linux, 1.2-macOS, et 2.1-Build-and-Deployment-Guide.md (cette
dernière portait la même erreur, présente avant mes modifications).
- Numérotation cassée dans « Option B: Installation from Source »
(Linux et macOS) : la suppression d'une étape lors de ma correction
precedente avait laissé un saut 3 → 5 sans renuméroter. Corrigé dans
les deux fichiers.
**Erreurs à impact utilisateur réel, ratées par la première passe** :
- Obsidian Vault Guide : la page affirmait qu'« Unlink » laisse l'index
en place et qu'un re-lien le réutilise. Vérifié contre
fusion-handlers.ts:619-631 — le handler fait `fs.unlink(dbPath)`,
l'index est bien supprimé ; se relier déclenche une reconstruction
complète. Un utilisateur suivant l'ancienne description perdrait du
temps à croire son index intact. Champ TITLE → TITRE corrigé au
passage (vérifié fusion-chat-service.ts:838).
- Tropy Integration Guide : un raccourci clavier Ctrl+Shift+S pour la
synchronisation n'existe nulle part (grep sur menu.ts et les
composants PrimarySources, aucune occurrence) — retiré. La page
décrivait aussi les embeddings comme figés sur nomic-embed-text ;
tropy-service.ts:98 utilise le provider configuré, comme partout
ailleurs dans l'app. Chemins de stockage corrigés vers brain.db +
primary-hnsw.index (vérifiés dans PrimarySourcesVectorStore.ts:125-126).
- MCP Integration Guide : la troncature des réponses (4000 caractères,
2000 pour Gallica/HAL) n'était pas documentée alors qu'elle est
visible dans les réglages de l'app elle-même ; ajoutée. Libellés des
onglets alignés sur l'UI réelle (« Claude Code CLI », « Generic MCP
(stdio) »).
Build-and-Deployment-Guide.md : la section « User Installation » citait
encore des noms de fichiers 1.0.0 sans suffixe arm64, alors que les
guides Linux/macOS avaient déjà été corrigés dans le même sens la
première fois — incohérence entre pages, maintenant alignée.
docs: RC2 wiki — Brainstorm, MCP, Archives, Obsidian + Home rewrite
Rewrites Home.md (was almost empty) as a navigable TOC and adds four new
user guides covering the features introduced by the ClioBrain fusion and
the surrounding RC2 work:
- 1.11 Brainstorm Mode — the chat mode that absorbed ClioBrain (agent
loop, `.cliohints`, source grounding, retrieval scope toggles).
- 1.12 MCP Integration — both directions: MCP clients consumed from
ClioDeck, and ClioDeck's own MCP server exposed to Claude Desktop /
Claude Code. Includes ready-to-paste snippets and the 9-tool catalog.
- 1.13 Archive Connectors — Gallica, HAL, Europeana. API key flow for
Europeana (Electron safeStorage).
- 1.14 Obsidian Vault — pointing the app at a vault folder, indexing,
use as a RAG source.
Plus 3.2 RC2 Release Notes, and the pre-RC2 release artefacts move to
`_archive/` (BETA 2 notes and the v1.0 implementation plan).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>