# nyora-notes-tt / nyora-convert-api -- 3 bugs decouverts en diagnostic (05/08/2026) **Instance auteur** : hermes-tt (diagnostic Claude, session nyora-notes-tt) **Date** : 2026-08-05 **Tags** : nyora-notes-tt, nyora-convert-api, fts5, sqlite, bifrost, mimo **Statut** : valide --- ## Probleme Trois bugs distincts decouverts lors de la reprise du chantier RAG OneDrive : 1. `search_onedrive_archive("RLA 2024/2025")` retournait 0 resultat alors que des documents pertinents existent -- reproductible sur toute requete contenant un `/`. 2. `nyora-convert-api` : reponses Bifrost de forme inattendue (~1-2% des appels) faisaient crasher la conversion d'un document au lieu de beneficier des retries deja en place. 3. `PROMPT_TEXT`/`PROMPT_VISION` de `nyora-convert-api` sans accents depuis leur creation (04/08), n'ayant jamais recu le traitement LANGUE applique aux SOUL.md Hermes le 19/07. --- ## Contexte et contraintes `onedrive_documents`/`onedrive_fts` (SQLite FTS5) + `onedrive_vec` (sqlite-vec) pour la recherche hybride. Les references AO tunisiennes et les dates contiennent systematiquement des `/` (`AO 19/2026`, `JJ/MM/AAAA`). `nyora-convert-api` et `nyora-notes-tt` sont buildes depuis leur `Dockerfile` local (`build: .`), pas d'image pre-construite -- toute modif source exige un rebuild + recreate du container pour prendre effet. --- ## Ce qui NE fonctionne PAS | Tentative | Erreur obtenue | Raison de l'echec | |-----------|----------------|-------------------| | Requete FTS5 brute avec mots separes par espace | `fts5: syntax error near "/"` | Le parseur de requete FTS5 interprete `/` comme un token invalide hors phrase citee | | Compter sur le repli LIKE en cas d'echec FTS/vecteur | 0 resultat quand meme | Le repli utilise la chaine litterale (avec le `/`), qui ne matche pas non plus | | `_call_bifrost` catchant seulement `HTTPStatusError`/`TimeoutException` | `KeyError('content')` non catche, document en echec direct | Une reponse 200 de forme inattendue n'est pas une erreur HTTP -- `resp.json()["choices"][0]["message"]["content"]` explose sans passer par la logique de retry | --- ## Solution validee **Bug FTS5** (`mcp_server.py`, `search_onedrive_archive` ET `search_mail_memory` -- meme bug present aux 2 endroits) : chaque terme de la requete est cite comme phrase FTS5 litterale au lieu d'etre passe en bareword. ```python # avant clean_q = " ".join([w for w in query.replace('"', ' ').replace("'", ' ').split() if len(w) > 1]) # apres clean_q = " ".join( '"' + w.replace('"', '""') + '"' for w in query.replace('"', ' ').replace("'", ' ').split() if len(w) > 1 ) ``` **Bug KeyError Mimo** (`converter.py`, `_call_bifrost`) : ajout des exceptions manquantes, converties en `ConversionError` pour beneficier de la boucle de retry existante (2 tentatives) : ```python except (KeyError, IndexError) as e: raise ConversionError(f"erreur interne : reponse Bifrost de forme inattendue ({type(e).__name__}: {e})") except json.JSONDecodeError as e: raise ConversionError(f"erreur interne : reponse Bifrost non-JSON ({e})") ``` **Bug accents** : `PROMPT_TEXT`/`PROMPT_VISION` reaccentues + ajout du bloc `## LANGUE — RÈGLE ABSOLUE` (copie identique de `hermes-agent-tt:/opt/data/SOUL.md`). **Deploiement (les deux services sont `build: .`, pas d'image prete)** : ```bash cd /volume1/docker/nyora-convert-api && docker compose build && docker compose up -d cd /volume1/docker/nyora-notes-tt && docker compose build && docker compose up -d ``` --- ## Verification ```python import sys; sys.path.insert(0, '/app') import mcp_server as m r = m.search_onedrive_archive('RLA 2024/2025', limit=3) print(r['count']) # attendu : > 0 (etait 0 avant fix) ``` --- ## Pieges specifiques DSM / NAS - Le build `docker compose build` sur ce NAS (DS920+, charge memoire elevee observee : ~19,4 Go utilises sur 20 Go au moment du diagnostic) peut prendre **plusieurs minutes** (build-essential/gcc pour compiler les dependances natives) -- ne pas juger un build "bloque" avant 5-8 min, verifier via `ps aux | grep 'compose build'` plutot que d'interrompre. - **Verifier aussi `search_mail_memory`** si ce runbook est applique ailleurs : meme pattern de nettoyage de requete, meme bug latent, corrige en meme temps ici mais a chercher systematiquement dans tout code FTS5 similaire (ex. nyora-veille). - Ni `nyora-convert-api` ni `nyora-notes-tt` n'etaient sur Gitea avant cette session (violation de la regle "tout repo va sur Gitea bolbol") -- bootstrap fait le 05/08/2026, voir `bolbol/nyora-convert-api` et `bolbol/nyora-notes-tt`. **Attention** : ne jamais pousser `*.db`/`*.db-wal`/`*.db-shm` (base live) ni `.env` (secrets) -- `.gitignore` ajoute a `nyora-notes-tt` suite a une quasi-erreur (tentative d'upload d'un `.db` de 74 Mo via l'API Gitea, timeout cote client avant completion, verifie a posteriori que rien n'avait ete commit). --- ## References - Bug FTS5 slash : SQLite FTS5 query syntax -- https://www.sqlite.org/fts5.html#full_text_query_syntax - Session diagnostic complete : NyoraNotes, note "nyora-notes-tt : 3 bugs corriges..." (05/08/2026) - Runbook associe : `common/bifrost-google-provider-key-rotation.md`